stm32數據存儲

大端模式:數據高字節保存在內存低地址,數據低字節保存在內存高地址;

小端模式:數據高字節保存在內存高地址,數據低字節保存在內存低地址;

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)。

求補碼的方法:

  1. 正數的補碼的最高位爲符號“0”,數值部分爲該數本身;負數的補碼的最高位爲符號“1”,數值部分爲用模減去該數的絕對值。
  2. 正數的補碼與其原碼相同;負數的補碼是符號位不變,數值位逐位取反(即求其反碼),然後在最低位加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

-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
所以內存上存儲爲:1,0111,1011,1001,1001,1001,1001,1001,101


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章