整型、浮點型在內存中的存儲方式

 

在學習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

(1)
會飛的豬會飛的豬
上一篇 2016-01-14 06:53
下一篇 2016-01-14 10:01

相關推薦

  • 小巧精悍——常見文本處理工具用法及技巧總結

    小巧精悍——常見文本處理工具用法及技巧總結 Linux最重要的哲學思想就是:一切皆文件??梢娢募拔募僮髟贚inux當中是多么的重要。在Linux系統中我們也會經常用到各種文本文件處理的操作,熟練使用這些小巧精悍的文本處理工具,在關鍵時刻往往展現非凡的神奇功效。常見文本處理小工具:cat、hexdump、nl、less、head、tail、cut、tr、r…

    Linux干貨 2016-11-05
  • 面向對象的實例方法,類方法和靜態方法

    類方法和靜態方法 普通函數 class Person: def normal_method(): print(‘normal’) Person.normal_method() # Person().normal_method() print(Person.__dict__) Person.normal_method()可以,是因為這個方法只是被Person這…

    2017-11-11
  • N25 第五周博客

      1、顯示當前系統上root、fedora或user1用戶的默認shell;      ]# egrep "^root\b|^user1\b|^fedora\b" /etc/passwd | cut -d: -f1,7…

    Linux干貨 2017-01-04
  • 磁盤配額、Raid及邏輯卷LVS

    磁盤配額、Raid及邏輯卷LVS 磁盤配額 Linux是多用戶的操作系統,同一時間可能有多個用戶登錄到系統上進行操作,某些用戶可能會寫入很多數據,占用大量磁盤空間,導致其他用戶沒有磁盤空間可用。如何限定某個用戶對磁盤的使用空間大小,以及可使用的inode多少,也就是限定可創建多少個文件,這就是磁盤配額管理的作用。 磁盤配額特點 在內核中執行; 以文件系統為單…

    Linux干貨 2016-09-19
  • 馬哥教育N22期第四周作業

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 root@xuc-virtual-machine:/home/xuc# cp -r /etc/skel/ /home/tuser1 root@xuc-virtual-machine:/…

    Linux干貨 2016-09-06
  • Linux的命令使用格式

    ◆Linux命令格式:command [options]  [arguments]command:命令options:  –單詞   或   -單字如: ls –allequ      ls -als -a -b -cequ&…

    Linux干貨 2016-10-31
欧美性久久久久