淺談C語言中資料的存盤
一個變數的存盤需要在記憶體中開辟新的空間,今天就來深度了解一下C語言中資料的存盤吧,
C語言中資料的存盤,可以分為四個方面:
1. 資料型別介紹
2. 整形在記憶體中的存盤:原碼、反碼、補碼
3. 大小端位元組序介紹及判斷
4. 浮點型在記憶體中的存盤決議
資料型別介紹
型別的意義:使用這個型別開辟的記憶體空間大小(大小決定范圍)
型別的基本歸類:
整形家族,浮點數家族,構造型別,指標型別,空型別(void)
整形在記憶體中的存盤
接下來談談資料在所開辟的記憶體中如何存盤
例:
int a=10;
int為整型變數,開辟4個位元組的空間給a.
當我們想探討如何存盤時,先讓我們了解一下原碼,反碼和補碼,
原碼,反碼和補碼
計算機中的有符號數有三種表達方式,原碼,反碼和補碼,
三種表示方式均有符號位和數值位,符號位用“0”表示正,“1”表示負,
原碼
直接將數翻譯為二進制
反碼
將原碼的符號位不變,其它位依次按位取反即可
補碼
反碼+1得到補碼
正數的原,反,補碼都相同
在計算機系統中,數值一律用補碼來表示和存盤,原因在于,使用補碼,可以將符號位和數值域統一處理; 同 時,加法和減法也可以統一處理(CPU只有加法器)此外,補碼與原碼相互轉換,其運算程序是相同的,不需 要額外的硬體電路,

記憶體中存的是十六進制的數,那為什么顯示出來的不是00 00 00 01呢?
這里要涉及到另一個知識點——大端/小端存盤
大小端位元組序介紹及判斷
什么是大/小端存盤?
大端存盤:將資料中的低位存到記憶體中的高地址中,高位則存入低地址中
小端存盤:將資料中的高位存到記憶體中的高地址中,低位則存入低地址中
記法:大端相反,小段照存
那如何判斷當前機器取大/小端存盤?
int main()
{
int a=1;
char* p=(char*)&a;//a強制轉換位char*,取一個字符
if(*p==1)
{
printf("小端\n");
}
else
{
printf("大端");
}
return 0;
}
浮點型在記憶體中的存盤決議
根據國際標準,任意一個二進制浮點數都可表示成下面的形式:
(-1)^S * M * 2^E
(-1)^S 表示符號位,s = 0 為正 s = 1為負
M表示有效數字,大于1小于2
2^E表示指數位
例:十進制5.0,寫成二進制101.0,相當于1.01x2^2,可退出S = 0, M = 1.01,E=2
IEEE 754規定:對于32位浮點數,最高1位是符號位S,下來是8位指數位E,剩下為23位有效數M,

單精度浮點型
IEEE745其中對有效數字M和指數E,有一些特殊要求
有效數M:1<=M<2
IEEE 754規定,在計算機內部保存M時,默認這個數的第一位總是1,因此可以被舍去,只保存后面的xxxxxx部分,比如保存1.01的時候,只保存01,等到讀取的時候,再把第一位的1加上去,這樣做的目的,是節省1位有效數字,以32位浮點數為例,留給M只有23位,將第一位的1舍去以后,等于可以保存24位有效數字
指數E: 情況就比較特殊
首先E是一個無符號整數,如果E是8位 其取值范圍 0 - 255;如果E是11位 其取值范圍0 - 2047.但是我們可知科學計數法中E可能出現負數,所以**IEEE754規定 :存入記憶體時E的真實值必須加還加上一個中間數,對于8位的E,中間數是127;對于11位的E,中間數1023.**例如:2^10的E是10,所以保存成32位浮點數時,必須保存成10+127=137,即10001001
指數E從記憶體中取出時可以分為三種情況:
1、E不全為0或不全為1
這時,浮點數就采用下面的規則表示,即指數E的計算值減去127(或1023),得到真實值,再將有效數字M前加上第一位的1, 比如: 0.5(1/2)的二進制形式為0.1,由于規定正數部分必須為1,即將小數點右移1位,則為1.0*2^(-1),其階碼為-1+127=126,表示為01111110,而尾數1.0去掉整數部分為0,補齊0到23位00000000000000000000000,則其二進制表示形式為0 01111110 00000000000000000000000
2、E全為0
這時,浮點數的指數E等于1-127(或者1-1023)即為真實值, 有效數字M不再加上第一位的1,而是還原為0.xxxxxx的小數,這樣做是為了表示±0,以及接近于0的很小的數字
3、E全為1
這時,如果有效數字M全為0,表示±無窮大(正負取決于符號位s)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256377.html
標籤:其他
上一篇:Dijkstra演算法總結
