深度剖析資料在記憶體中的儲存(整型和浮點型)

2021-09-30 01:10:48 字數 3870 閱讀 5461

我們知道乙個變數的建立是要在記憶體中開闢空間的,空間的大小是根據不同的型別而決定的,而且不同的型別也影響著我們看待記憶體空間的視角。

比如:int a = 20,float b= 5.0

接下來我們看看資料在所開闢的型別中是如何儲存的?

整型家族

char

unsigned char,signed char

short

unsigned short,signed short

intunsigned int,signed int

long

unsigned long,signed long

原碼、反碼、補碼

對整型來說:資料存放記憶體中其實存放的是補碼(正數的原反補碼都相同)

原因是:1.符號位和數值位可以統一處理。2.加法和減法可以統一處理(cpu只有加法器)。3.補碼與原碼相互轉換,運算過程也是相同的,不需要額外的硬體電路。

16進製制存放

我們發現對a和b分別存放的是補碼,但順序有點不對勁,這又是為什麼呢?

大端和小端

小端儲存模式:資料的地位儲存在記憶體的低位址中,資料的高位儲存在記憶體的高位址中。

記憶體中從左到右依次是由低位址到高位址

設計乙個程式來判斷當前機器的位元組序

#include

intcheck()

intmain()

else

return0;

}

下面程式輸出什麼?

練習題1

#include

intmain()

執行結果

a=-1,b=-1,c=255

解析

唯一的不同點就是a,b,c 的型別不同,輸出結果卻有如此大的差異。

將-1(int)2進製為11111111 11111111 11111111 11111111的值賦給char型別時首先發生的時整型的截斷,char接收到的只是-1最低位的乙個位元組2進製為:1111 1111

printf輸出時以%d的形式輸出cahr型別會發生整型的提公升,發生提公升時,有符號數高位補符號位,無符號數高位補0。

有符號數a的補碼為:11111111 11111111 11111111 11111111

有符號數b補碼為:11111111 11111111 11111111 11111111

無符號數c補碼為:00000000 00000000 00000000 11111111

練習題2

#include

intmain()

執行結果

4294967168

解析

首先根據a的原碼寫出a的補碼

根據整型的截斷,char接收到的是a最低位的乙個位元組2進製為:1000 0000

列印時%u為無符號整型,則cahr a發生整型提公升無符號數a的補碼為:11111111 11111111 11111111 10000000無符號數的補碼=原碼。

練習題3

#include

#include

intmain()

printf

("%d\n"

,strlen

(a))

;return0;

}

執行結果

255

解析

strlen求字串長度,實質找的是』\0』的位置,即a = 0時。

i從0開始到999,a[i]接收值從-1到-1000,char a [i]會發生整型的截斷,低位乙個位元組為0000 0000時,即求出字串長度。(注意『\0』不計入字串長度)

i = 0時-1截斷之後為:1111 1111

i = 1時-2截斷之後為:1111 1110

i = 2時-3截斷之後為:1111 1101

當達到0000 0000時i = 255(下標),則字串長度為0到254,輸出255。

浮點型家族

float,double,long double

浮點型儲存的例子

n和*pfloat在記憶體中明明是同乙個數,為什麼整數和浮點數的解讀結果會差別這麼大?要理解這個結果,我們首先要搞懂浮點數在計算機內部的表示方法。

根據國際標準ieee(電氣和電子工程協會)754,任意乙個二進位制浮點數v可以表示為下面的形式:(-1)^s*m*2^e

(-1)^s表示符號位,當s=0時,v為正數;當s=1時,v為負數;

m表示有效數字,大於等於1小於2;

2^e表示指數字;

舉例來說:

如何把十進位制的浮點型轉換為二進位制呢?

例如十進位制0.5轉化為二進位制為0.1

float a = 5.0儲存如下(-1)^0*1.01*2^2

對於雙精度浮點型 s(1bit) e(11bit) m(52bit)

因為整型儲存和浮點儲存的規則不同,所以在輸出時才會產生如此大的差別。

回到剛開始的問題:

整型9: 0000 0000 0000 0000 0000 0000 0000 1001還原為浮點型

由浮點儲存規則得 指數e全為0,e=1-127,有效數字m不再加1,而是表示為0.***xx,浮點數v=(-1)^0*0.00000000000000000001001*2^-126=1.001*2^-146,所以用十進位制小數表示為0.000000

浮點型9.0用二進位制表示為1001.0

v=(-1)^0*1.001*2^3,s=0,m=1.001,e=3+127=130,儲存為0 10000010 001 0000 0000 0000 0000 0000,還原為10進製為1091567616

深度剖析資料在記憶體中的儲存

我們要想知道資料如何在記憶體中的儲存,就必須先談談資料型別的意義 1 如果我們把記憶體看成乙個個房間,那麼資料型別就決定了房間號和房間大小,這樣應該很好理解了吧 接下來我們來談談資料型別的分類 1 整形家族 char 有符號字元型,只不過把signed省略了 unsigned char 無符號型別字...

剖析資料在記憶體中的儲存

乙個變數的建立是要在記憶體中開闢空間的,空間的大小是根據及不同的型別所決定的。在討論資料在所開闢記憶體中是如何儲存的之前要了解以下概念。例 答案 1,1,255 解析 首先要進行整形提公升,提公升時,要看自己的型別,有符號新增 1 無符號則新增 0 要看變數的型別 確定是否有符號位 若為無符號位,直...

整型資料在記憶體中如何儲存

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!以下討論,針對32位的計算機系統。問 int型資料佔幾個位元組?答 4位元組。地球上這個群體的人都知道。再問 這4個位元組,即32個二進位制位,又是何儲存?這就進入計算機的 底層 了。這個事情,學習程式設計的童鞋,可以懂。儲存的方式,和我們拍腦袋想...