C 中double資料型別的記憶體模型

2021-06-22 20:47:01 字數 1184 閱讀 7059

今天在使用union聯合體的時候無意中發現double的記憶體模型和古怪,o(︶︿︶)o 唉,只能說自己當時計算機組成沒有學好,

更確切的說是自己當時沒怎麼學懂,好在今天解決了它。

首先發乙個**(問題的引出):

斷點除錯:

檢視memory:

由此圖大家可以看到double型別的b成員的值很古怪,到底是怎麼組織的呢???

帶著問題我們進行求解:

首先是基礎知識:

double資料型別的

實現使用的是

如下規定:

````````符號位 階碼 尾數 長度 

float    1    8    23  32 

double  1    11    52  64 

但是這到底是什麼意思呢?

為了便於測試和說明,我把我的**重新改正了一下:

即賦值乙個double資料12.0(隱式型別轉化,呵呵)

然後檢視記憶體模型:

把28和40的二進位制計算出來:

如下:28:00101000

40:01000000

開始使用剛才的標準了。

double  1    11    52  64 

(注意在開始錢要注意使用的cpu到底是大端的還是小端的,這個影響記憶體的存放順序)(其實只是反正的問題)

我這的順序是從大位址對應高位(大部分都是這種情況)

第一位是資料的符號位:0代表是正,1代表的是負。

在這裡是0,所以是正數。

之後的11位代表的是指數(階數)。注意指數是有正負的區別的,即從

-1024 ~ 1023。因為指數可以為負,為了便於計算,規定都先加上1023(這個很重要!!!!)。但是為什麼是加1023那就只能去問專家了,呵呵.

在這裡是10000000010,因為這是加上1023之後的資料,需要變化回去,有一種簡單的方法,那就是先將1去掉(存在1說明是正數),然後最後加上1,最後得到00000000011,即3,所以指數是3.

然後是尾數:

1000...(...號代表的是後面的0,在此處省略)

根據標準規定,尾數開始的那個1是省略的(這個也很重要!!),因此真正的尾數是1.100...

到現在你明白了吧,我們的結果出來了;

即:1.100...(二進位制)然後小數點偏移3位(因為指數是3)即為1100,轉化為十進位制就是12.

mySql中double資料型別進製規則疑問???

sql的double資料型別網上看是採用四捨六入五成雙的方式。是一種比較精確比較科學的計數保留法,是一種數字修約規則。規則如下 1.被修約的數字小於5時,該數字捨去 2.被修約的數字大於5時,則進製 3.被修約的數字等於5時,要看5前面的數字,若是奇數則進製,若是偶數則將5捨掉,即修約後末尾數字都成...

C中資料型別占用記憶體的大小

資料型別表示儲存何種型別的資料,從記憶體來看,就是占用的記憶體大小。c標準並未明確規定各資料型別占用多少位元組的儲存空間。各資料型別的記憶體大小與作業系統位數 編譯器有關,可以在 中使用sizeof 進行查詢。1 字元型別 char占用1個位元組 表示的是字元對應的ascii碼 2 浮點型別 flo...

C 中的資料型別

一 值型別 三種 1 簡單型別 types a 整數型別 八種 sbyte 有符號8位整數 128 127 byte 無符號8位整數 0 255 short 有符號16位整數 32768 32767 ushort 無符號16位整數 0 65535 int 有符號32位整數 2147483648 21...