大端模式:數據高字節保存在內存低地址,數據低字節保存在內存高地址;
小端模式:數據高字節保存在內存高地址,數據低字節保存在內存低地址;
stm32默認小端存儲,如下圖:
有:
volatile float f = -0.1;
volatile float *p = &f;
volatile uint32_t i = 0xaabbccdd;
volatile uint32_t *p2 = &i;
volatile int32_t i2 = -5;
volatile int32_t *p3 = &i2;
變量名 | 地址 | 值 |
f | 0x20000000 | 0xBDCCCCCD |
p | 0x20000004 | 0x20000000 |
i | 0x20000008 | 0xAABBCCDD |
p2 | 0x2000000B | 0x20000008 |
看0x20000000地址存儲的值,0xBDCCCCCD的存儲順序爲CD CC CC BD,變量i的值的地址0x20000008存DD,之後一次存放CC BB AA。
計算機編碼概念:參http://share.onlinesjtu.com/mod/tab/view.php?id=173點擊打開鏈接
原碼:符號位爲0表示正數,爲1表示負數,數值部分用二進制數的絕對值表示的方法稱爲原碼錶示法,通常用[X]原表示X的原碼。
反碼:正數的反碼與原碼相同,負數的反碼是符號位不變,數值位逐位取反。
補碼:把某數X加上模數K,稱爲以K爲模的X的補碼。[X]補=K+X(計算機中的加法器是以2n爲模的有模器件,單字節有符號數據的模式2^8,即256)。
求補碼的方法:
- 正數的補碼的最高位爲符號“0”,數值部分爲該數本身;負數的補碼的最高位爲符號“1”,數值部分爲用模減去該數的絕對值。
- 正數的補碼與其原碼相同;負數的補碼是符號位不變,數值位逐位取反(即求其反碼),然後在最低位加1。
移碼:通常來說在計算機科學中,移碼就是將補碼的符號位取反,如下:
-120D = -1111000B(真值) 原碼:11111000 反碼:10000111 補碼:10001000 移碼:00001000 這樣的移碼也可以叫做偏移值爲128的移碼,也是標準移碼(偏移值爲2k-1,k爲數據位數),即10000000B+(-1111000B)=10000000B+(10001000B)=00001000B。這樣移碼就可以表示爲原數的補碼加上偏移值。在IEEE 754浮點數表示中移碼是非標準的,它的偏移值爲2k-1-1,也就是說對於單精度浮點數的偏移值 爲127(雙精度爲1023)。參:https://zh.wikipedia.org/wiki/%E7%A7%BB%E7%A0%81維基百科STM32的整型數據以補碼形式存儲,如上圖:-5在內存中的存儲值爲0xFFFFFFFB,
-5: 原碼:0x80000005 1000,0000,0000,0000,0000,0000,0000,0101(B)
反碼:0xFFFFFFFA 1111,1111,1111,1111,1111,1111,1111,1010(B)
補碼:0xFFFFFFFB 1111,1111,1111,1111,1111,1111,1111,1011(B)
浮點型數據存儲:
STM32採用IEEE二進制浮點數算術標準(IEEE
754)參:https://zh.wikipedia.org/wiki/IEEE_754
IEEE標準從邏輯上採用一個三元組{S, E, M}來表示一個數N,它規定基數爲2,符號位S用0和1分別表示正和負,尾數M用原碼錶示,階碼E用移碼錶示。根據浮點數的規格化方法,尾數域的最高有效位總是1,由此,該標準約定這一位不予存儲,而是認爲隱藏在小數點的左邊,因此,尾數域所表示的值是1.M(實際存儲的是M),這樣可使尾數的表示範圍比實際存儲多一位。爲了表示指數的正負,階碼E通常採用移碼方式來表示,將數據的指數e 加上一個固定的偏移量後作爲該數的階碼,這樣做既可避免出現正負指數,又可保持數據的原有大小順序,便於進行比較操作。(不使用標準移碼原因,猜測是使用標準的偏移量2^(k-1)得到的最小數是1,最大數變成了0,數域爲[-(2^(k-1)-1),2^(k-1)])參:http://share.onlinesjtu.com/mod/tab/view.php?id=176