天天看點

c++ 讀取記憶體資料 基址_C/C++中float & double類型資料在記憶體中的存儲形式

我又來了,第二篇部落格fighting,接着第一篇,這裡讨論一下C/C++中float & double類型資料在記憶體中的存儲方式

如有侵權,請聯系删除,如有錯誤,歡迎大家指正,謝謝

IEEE規定

IEEE規定float & double類型的資料用三元組{S, E, M}表示,"S"用0和1分别表示正數和負數,尾數"M"用原碼表示,階碼"E"用移碼表示,還規定尾數域的最高有效位總是1,并且最高位不予存儲(都是1也就不用浪費存儲空間了)

float類型

單精度浮點數float(32bit)表示為: SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM

  1. 符号位(S)1 bit;
  2. 階碼(E)8 bit,階碼的偏移量為127(7FH);
  3. 尾數(M)23 bit,用小數表示,小數點放在尾數域的最前面.

是以 32bit 的單精度浮點數可表示為:

c++ 讀取記憶體資料 基址_C/C++中float & double類型資料在記憶體中的存儲形式

double類型

雙精度浮點數double(64bit)表示為: SEEE EEEE EEEE MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM

  1. 符号位(S)1 bit;
  2. 階碼(E)11 bit,階碼的偏移量為1023(3FFH);
  3. 尾數(M)52 bit,用小數表示,小數點放在尾數域的最前面.

是以 64bit 的雙精度浮點數可表示為:

c++ 讀取記憶體資料 基址_C/C++中float & double類型資料在記憶體中的存儲形式

注意

  1. 當一個浮點數的尾數為0,不論其階碼為何值,或者當階碼的值遇到比他能表示的最小值還小時,不管其尾數為何值,計算機都把該浮點數看成零值,稱為機器零;
  2. 當階碼E為全0且尾數M也為全0時,表示的真值為零,結合符号位S為0或1,有正零和負零之分;
  3. 當階碼E為全1且尾數M也為全0時,表示的真值為無窮大,結合符号位S為0或1,有正無窮和負無窮之分,故在32 bit浮點數表示中,要去除E用全0和全1(255)表示零和無窮大的特殊情況,是以,階碼E的取值範圍變為1—254,指數的偏移量不選128(1000 0000B),而選127(0111 1111B),對于32 bit表示的浮點數,真正的指數值e為-126到+127,是以32 bit浮點數的範圍為2的-126次方—2的127次方約等于10的-38次方—10的38次方,64 bit浮點數double與32 bit浮點數float推導方法相似

LWenlong:C/C++中記憶體對齊問題的一些了解​zhuanlan.zhihu.com

c++ 讀取記憶體資料 基址_C/C++中float & double類型資料在記憶體中的存儲形式

繼續閱讀