stm32數(shù)據(jù)存儲
大端模式:數(shù)據(jù)高字節(jié)保存在內(nèi)存低地址,數(shù)據(jù)低字節(jié)保存在內(nèi)存高地址;
小端模式:數(shù)據(jù)高字節(jié)保存在內(nèi)存高地址,數(shù)據(jù)低字節(jié)保存在內(nèi)存低地址;
stm32默認(rèn)小端存儲,如下圖:
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;
看0x20000000地址存儲的值,0xBDCCCCCD的存儲順序為CD CC CC BD,變量i的值的地址0x20000008存DD,之后一次存放CC BB AA。
計算機編碼概念:參http://share.onlinesjtu.com/mod/tab/view.php?id=173點擊打開鏈接
原碼:符號位為0表示正數(shù),為1表示負(fù)數(shù),數(shù)值部分用二進制數(shù)的絕對值表示的方法稱為原碼表示法,通常用[X]原表示X的原碼。
反碼:正數(shù)的反碼與原碼相同,負(fù)數(shù)的反碼是符號位不變,數(shù)值位逐位取反。
補碼:把某數(shù)X加上模數(shù)K,稱為以K為模的X的補碼。[X]補=K+X(計算機中的加法器是以2n為模的有模器件,單字節(jié)有符號數(shù)據(jù)的模式2^8,即256)。
求補碼的方法:
正數(shù)的補碼的最高位為符號“0”,數(shù)值部分為該數(shù)本身;負(fù)數(shù)的補碼的最高位為符號“1”,數(shù)值部分為用模減去該數(shù)的絕對值。
正數(shù)的補碼與其原碼相同;負(fù)數(shù)的補碼是符號位不變,數(shù)值位逐位取反(即求其反碼),然后在最低位加1。
移碼:通常來說在計算機科學(xué)中,移碼就是將補碼的符號位取反,如下:
-120D = -1111000B(真值)原碼:11111000反碼:10000111補碼:10001000 移碼:00001000這樣的移碼也可以叫做偏移值為128的移碼,也是標(biāo)準(zhǔn)移碼(偏移值為2k-1,k為數(shù)據(jù)位數(shù)),即10000000B+(-1111000B)=10000000B+(10001000B)=00001000B。這樣移碼就可以表示為原數(shù)的補碼加上偏移值。在IEEE 754浮點數(shù)表示中移碼是非標(biāo)準(zhǔn)的,它的偏移值為2k-1-1,也就是說對于單精度浮點數(shù)的偏移值為127(雙精度為1023)。參:https://zh.wikipedia.org/wiki/%E7%A7%BB%E7%A0%81維基百科
STM32的整型數(shù)據(jù)以補碼形式存儲,如上圖:-5在內(nèi)存中的存儲值為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)
浮點型數(shù)據(jù)存儲:
STM32采用IEEE二進制浮點數(shù)算術(shù)標(biāo)準(zhǔn)(IEEE 754)參:https://zh.wikipedia.org/wiki/IEEE_754
IEEE標(biāo)準(zhǔn)從邏輯上采用一個三元組{S, E, M}來表示一個數(shù)N,它規(guī)定基數(shù)為2,符號位S用0和1分別表示正和負(fù),尾數(shù)M用原碼表示,階碼E用移碼表示。根據(jù)浮點數(shù)的規(guī)格化方法,尾數(shù)域的最高有效位總是1,由此,該標(biāo)準(zhǔn)約定這一位不予存儲,而是認(rèn)為隱藏在小數(shù)點的左邊,因此,尾數(shù)域所表示的值是1.M(實際存儲的是M),這樣可使尾數(shù)的表示范圍比實際存儲多一位。為了表示指數(shù)的正負(fù),階碼E通常采用移碼方式來表示,將數(shù)據(jù)的指數(shù)e 加上一個固定的偏移量后作為該數(shù)的階碼,這樣做既可避免出現(xiàn)正負(fù)指數(shù),又可保持?jǐn)?shù)據(jù)的原有大小順序,便于進行比較操作。(不使用標(biāo)準(zhǔn)移碼原因,猜測是使用標(biāo)準(zhǔn)的偏移量2^(k-1)得到的最小數(shù)是1,最大數(shù)變成了0,數(shù)域為[-(2^(k-1)-1),2^(k-1)])參:http://share.onlinesjtu.com/mod/tab/view.php?id=176
-0.1 -> -0.00011001100110011001101 -> -1.1001100110011001101*2^(-4)(注意:是-0.00011001100110011001101,而不是-0.00011001100110011001100,因為不能完全表示為2進制,進一法表示,即-0.0001100110011001100110011....進一表示為-0.00011001100110011001101)
S:1;
E:127+(-4)=123 -> 0111,1011(B)
M:1.M=1.1001100110011001101-> M為1001100110011001101
所以內(nèi)存上存儲為:1,0111,1011,1001,1001,1001,1001,1001,101