在學習C語言的過程中,有時候會想,數據到底是以什么樣的方式在內存中存儲的呢?經過一段時間的查閱資料,小編終于整理了一些……
以VC6.0編譯器為測試環境(int型為4Byte)
先簡介一下大小端模式,具體資料可參考
http://blog.csdn.net/ce123_zhouwei/article/details/6971544
簡介一下:
大端模式:Big-Endian
就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端
小端模式:Little-Endian
就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端
我們常用的x86系列cpu,就是小端模式存儲方式的……
一、正整型
正整型,沒什么好說的,就是補碼存儲方式,正數的補碼和原碼相同,即先轉換為二進制,然后高位擴展0,一直填充至32位……
比如:5這個數的存儲方式如下
先轉換為二進制:101
因為只有3位,所以前面填充29個0,即 00000000 00000000 00000000 00000101
二、負整型
負整型,跟正整型一樣,也是補碼存儲方式,不過負數的補碼計算方式是取絕對值的二進制,按位取反再加1
比如:-5這個數
先取絕對值,即5,即 00000000 00000000 00000000 00000101
然后按位取反:11111111 11111111 11111111 11111010
再加1:即 11111111 11111111 11111111 11111011
三、正浮點型
浮點型中有兩種,一種是4Byte的float型,一種是8Byte的double型,這兩種計算方式都一致,只是有點點區別
1、float型:
float型是遵循IEEE R32.24規范,即1位符號位、8位階碼、23位尾數
具體計算方式是先用科學計數法表示出該數的二進制,然后計算出階碼值,最后把尾數補足23位,依此存儲
比如125.5這個數
先看整數部分,125表示成二進制是1111101,(整數轉換二進制是除二取余)
再看小數部分,0.5表示成二進制是0.1,(小數轉換二進制是乘二取整)
所以125.5用二進制表示就是1111101.1,轉換成科學計數法就是1.1111011 x 2^6(階數為6)
但是這里的階碼是用移碼的形式表示,float型的偏置量是127,于是6+127=133,即10000101
這里前面的9位就出來了,因為是正數,所以符號位為0,階碼為10000101
后面的尾數就是1111011,在后面補0,湊齊23位,即 1111011 00000000
00000000(因為科學計數法的整數部分總是為1,所以,這個1不用存儲)
所以125.5的存儲方式為 0 10000101 11110110000000000000000
即: 01000010 11111011 00000000 00000000
2、double型
double型跟float型計算方式類似,不過區別在于double型遵循IEEE R64.53規范
a、double的符號位是1位,階碼為11位,尾數為52位
b、double的偏置量是1023,而float是127
四、負浮點型
和上面一樣,不過就是符號位用1表示,就這點小區別
五、驗證方式
有兩種驗證方式,一種是用聯合體的方法、一種是強制類型轉換方法
1、聯合體法:
可以定義一個聯合體,比如
union data
{
float a;
char array[4];
};
那么可以對a賦值,然后依次輸出數組array的各個元素,這樣就可以驗證
2、強制類型轉換法:
float a;
char *p=(char *)&a;
這樣,將a的地址強制轉換為指向字符類型之后,賦值給指針p,后續再依次輸出*p、*(p+1)、*(p+2)、*(p+3)的值,也可以進行驗證
參考資料:http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html
原創文章,作者:會飛的豬,如若轉載,請注明出處:http://www.www58058.com/11037