C語言 | 深度剖析資料在記憶體中的儲存(原碼,反碼,補碼,大小端儲存)
一、常用資料型別及所佔位元組數
型別 | 16位 | 32位 | 64位 |
---|---|---|---|
char | 1 | 1 | 1 |
short | 2 | 2 | 2 |
int | 2 | 4 | 4 |
unsigned int | 2 | 4 | 4 |
long | 4 | 4 | 8 |
unsigned long | 4 | 4 | 8 |
long long | 8 | 8 | 8 |
float | 4 | 4 | 4 |
double | 8 | 8 | 8 |
二、整形在記憶體中的儲存(原碼,反碼,補碼)
整形儲存,在計算機中按照補碼形式儲存
————————————————————————————————儲存————————————————————————————————
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。
一些規定:
- 對於有效數字M,因為1≤M≤2,所以M可以寫成1.xxxxxx的形式,其中xxxxxx表示小數部分,所以在計算機內部儲存M時,預設這個數的第一位總是1,,因此可以被捨去,只儲存後面的xxxxxx部分。等到讀取的時候,再把第一位的1加上去。比如儲存1.01的時候,只儲存01,等到讀取的時候,再把第一位的1加上去。
- 對於指數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。
- 指數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)
相關文章
- 【C語言】整型在記憶體中的儲存C語言記憶體
- spark 原始碼分析之十六 -- Spark記憶體儲存剖析Spark原始碼記憶體
- 記憶體中的資料儲存記憶體
- with as 語句真的會把資料存記憶體嘛?(原始碼剖析)記憶體原始碼
- 資料在記憶體中儲存的方式:大端模式與小端模式記憶體模式
- double型別資料在記憶體中中儲存格式型別記憶體
- 計算機補碼儲存計算機
- C/C++浮點數在記憶體中的儲存方式C++記憶體
- C語言細節 儲存類別,連結,記憶體管理C語言記憶體
- 小數在記憶體中是如何儲存的?記憶體
- 大小端儲存模式模式
- 【C語言深度剖析】測試系統儲存是大端模式還是小端模式的方法C語言模式
- spark 原始碼分析之十八 -- Spark儲存體系剖析Spark原始碼
- sqlserver資料庫還原儲存過程指令碼SQLServer資料庫儲存過程指令碼
- 使用儲存指令碼還原恢復資料庫指令碼資料庫
- memcached全面剖析--2.理解memcached的記憶體儲存記憶體
- 在 macOS 內使用大小寫敏感的 APFS 卷儲存程式碼Mac
- 深入剖析 RocketMQ 原始碼 - 訊息儲存模組MQ原始碼
- InnoDB儲存引擎——記憶體儲存引擎記憶體
- 3 python的數值在記憶體中如何儲存Python記憶體
- [C語言] 浮點型儲存C語言
- rman儲存指令碼指令碼
- 程式程式碼,常量,區域性變數,全域性變數在記憶體中的儲存位置變數記憶體
- Redis 記憶體優化神技,小記憶體儲存大資料Redis記憶體優化大資料
- 解讀記憶體資料庫的儲存需求RC記憶體資料庫
- 原碼 補碼 反碼
- 深圳Java培訓:Java中的float在記憶體中的儲存Java記憶體
- win10 mstsc怎麼儲存遠端密碼_win10 mstsc如何儲存遠端密碼Win10密碼
- Swift記憶體賦值探索一: 理解物件在記憶體中的儲存狀態Swift記憶體賦值物件
- 清除SVN儲存的密碼密碼
- 如何安全的儲存密碼密碼
- Java 原碼 反碼 補碼Java
- 網頁密碼儲存網頁密碼
- 臨時儲存程式碼
- 聊聊密碼儲存中的安全問題密碼
- Android中的資料儲存之檔案儲存Android
- 資料庫到底應該如何儲存密碼?資料庫密碼
- 資料儲存--檔案儲存