1. 程式人生 > >單精度float變數在記憶體中的儲存形式

單精度float變數在記憶體中的儲存形式

首先我們知道單精度型佔4個位元組的大小也就是32個bit位和整形大小一樣
但是儲存方式卻有很大的區別。
32個bit位可以分為三個部分
0(1個bit位)
00000000(8個bit位)
00000000000000000000000(23個bit位)
第一部分是 符號部分 和有符號整形一樣1為負 0為正
第二部分是 階碼部分 31位到第24位這8個二進位制位表示該實數轉化為規格化的二進位制實數後的指數與127(127即所謂偏移量)之和即所謂階碼.
第三部分是 尾數部分 其他最低的23位即第22位到第0位表示該實數轉化為規格化的二進位制實數後小數點以後的其餘各位即所謂尾數.
下面可能會略微繁瑣一點,因為尾數部分和指數部分不只是用整數方式表示二進位制。

  1. 第一步
    尾數部分
    首先將小數點前面的值固定為1,也就是科學計數法。
    例如:178.125(十進位制)=10110010.001
    可以寫成1.0110010001*2^7
    捨去前面的1(所以實際上可以表示24位的數值)就剩下0110010001然後後面都補0夠23位
    也就是01100100010000000000000(尾數部分)

  2. 第二步
    階碼部分
    我們剛求的尾數部分後面是2^7所以指數就為7,階碼為127+7=134
    134的二進位制是10000110
    所以178.125(十進位制)在記憶體中是以下形式儲存的
    0 10000110 01100100010000000000000

我們可以用下面程式碼測試下我說的對不對

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h> void main() { float value = 178.125; unsigned long buff = 0; memcpy(&buff, &value, 4);//記憶體拷貝 for (int i = 31; i >= 0; i--) { if (((buff >> i) & 1) == 1) { printf("1"); } else
{ printf("0"); } } system("pause"); }