我們知道乙個變數的建立是要在記憶體中開闢空間的,空間的大小是根據不同的型別而決定的,而且不同的型別也影響著我們看待記憶體空間的視角。
比如: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個二進位制位,又是何儲存?這就進入計算機的 底層 了。這個事情,學習程式設計的童鞋,可以懂。儲存的方式,和我們拍腦袋想...