C語言 | 深度剖析資料在記憶體中的儲存(原碼,反碼,補碼,大小端儲存)

xxzaa發表於2020-11-23



一、常用資料型別及所佔位元組數

型別16位32位64位
char111
short222
int244
unsigned int244
long448
unsigned long448
long long888
float444
double888

二、整形在記憶體中的儲存(原碼,反碼,補碼)

整形儲存,在計算機中按照補碼形式儲存

————————————————————————————————儲存————————————————————————————————

1.補碼:
a.無符號數:補碼就是它對應的二進位制序列
b.有符號數:data——>原碼——>反碼——>補碼
2.原碼 vs 反碼
原碼:就是對應整形的二進位制序列,需要特殊考慮的是符號位。
最高位是符號位(1——>負數,0——>正數)
反碼:原碼符號位不變,其他位進行按位取反
補碼:就是反碼+1
正數的原、反、補碼都相同

—————————————————————————————————取————————————————————————————————

1.先看型別,再做決定
2.符號:
有符號數:按照最高符號位0,1進行解釋,分別逆向轉化回去
無符號數:逆向轉化回去
20: 0000 0000 0000 0000 0000 0000 0001 0100
-10:原碼:1000 0000 0000 0000 0000 0000 0000 1010
反碼:1111 1111 1111 1111 1111 1111 1111 0101
補碼:1111 1111 1111 1111 1111 1111 1111 0110

三、大小端儲存

地址有高地址和低地址之分,資料有高權值和低權值之分
以位元組為單位,計算機儲存分為:大端儲存和小端儲存

大端儲存:資料的低位儲存在記憶體的高地址中,而資料的高位儲存在記憶體的低地址中
小端儲存:資料的低位儲存在記憶體的低地址中,而資料的高位儲存在記憶體的高地址中

口訣:小:小,小(小端儲存:低權值位放在低地址處)

//判斷當前機器的位元組序
#include<stdio.h>
#include<windows.h>
int check_sys(){
	int i = 1;
	return(*(char*)&i); //&i取的是開闢的四個位元組中的地址最小的
}
int main(){
	int ret = check_sys();
	if (ret == 1){
		printf("小端\n");
	}
	else{
		printf("大端\n");
	}
	system("pause");
	return 0;
}

四、浮點形在記憶體中的儲存

根據國際標準IEEE754,任意一個二進位制浮點數V可以表示成下面的形式:

  • (-1)^S * M * 2^E
  • (-1)^S表示符號位,當S=0時,V為正數;當S=1時,V為負數
  • M表示有效數字,大於等於1,小於2
  • 2^E表示指數位

例:十進位制的5.0,寫成二進位制是101.0,相當於1.01×2^2。按照上面的格式,可以得到S=0,M=1.01,E=2
十進位制的-5.0,寫成二進位制是-101.0,相當於-1.01×2^2。那麼,S=1,M=1.01,E=2
IEEE754規定:對於32位的浮點數,最高的1位是符號位S,接著的8位是指數E,剩下的23 位為有效數字M。
在這裡插入圖片描述

對於64位的浮點數,最高的1位是符號位S,接著的11位是指數E,剩下的52 位為有效數字M。
在這裡插入圖片描述
一些規定:

  1. 對於有效數字M,因為1≤M≤2,所以M可以寫成1.xxxxxx的形式,其中xxxxxx表示小數部分,所以在計算機內部儲存M時,預設這個數的第一位總是1,,因此可以被捨去,只儲存後面的xxxxxx部分。等到讀取的時候,再把第一位的1加上去。比如儲存1.01的時候,只儲存01,等到讀取的時候,再把第一位的1加上去。
  2. 對於指數E,E為1個無符號整數,這意味著,如果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。
  3. 指數E從記憶體中取出時分為以下三種情況:
    · E不全為0或不全為1:浮點數採用下面的規則表示,即指數E的計算值減去127(或1023),得到真實值,再將有效數字M前加上第一位的1。比如:
    · E全為0值:這時,浮點數的指數E等於1-127(或者1-1023)即為真實值,有效數字M不再加上第一位的1,而是還原為0.xxxxxx的小數。
    · E全為1:這時,如果有效數字M全為0,表示正負無窮大(正負2取決於符號位S)

相關文章