資料在記憶體中的存盤方式
- 1.資料型別的詳細介紹
- 整型
- 浮點型
- 構造型別
- 指標型別
- 空型別
- 2.整型在記憶體中的存盤(原,反,補)
- 3.浮點型在記憶體中的存盤
- 4.資料在大端和小端中的存盤方式
- 什么是大端小端?
- 如何判斷一臺機器是大端存盤模式還是小端存盤模式?
1.資料型別的詳細介紹
型別決定了開辟空間的大小,同時也決定了使用范圍
整型
char
unsigned char 無符號字符型 (范圍:0~255,占一個位元組)
signed char 有符號字符型(范圍:-128~127,占一個位元組)
short
unsigned short 無符號短整型(范圍:0~65535,占兩個位元組)
signed short 有符號短整型(范圍:-32768~32767,占兩個位元組)
int
unsigned int 無符號整型(范圍:0~4294967295,占四個位元組)
signed int 有符號整型(范圍:-2147483648~2147483647,占四個位元組)
long
unsigned long 無符號長整型(范圍:0~2^64-1,占八個位元組)
signed long 有符號長整型(范圍:-2^31 ~2^31-1,占八個位元組)
浮點型
float(占四個位元組)
double(占八個位元組)
構造型別
陣列型別
結構體型別 struct
列舉型別 enum
聯合型別 union
指標型別
char*(占四個位元組)
int*(占四個位元組)
float*(占四個位元組)
void*(占四個位元組)
雖然他們都占四個位元組,但在一般情況下,他們無法互相賦值,
空型別
void表示空型別即無型別,
通常用于函式的回傳值型別,函式的引數,指標型別,
void*可以接受任意型別變數的地址,但無法給其他型別指標賦值,
2.整型在記憶體中的存盤(原,反,補)
整型在記憶體中是以補碼的方式存盤的,
原因:在計算機系統中,數值一律用補碼來表示和存盤,原因在于使用補碼存盤可以將符號位與資料位統一處理,加法減法也能統一處理,此外,補碼與原碼的相互轉換不需要額外的硬體電路,
整型的原碼,反碼,補碼:
對于正數而言:原碼=反碼=補碼;
對于負數而言:
原碼:整數的二進制形式,
反碼等于原碼的符號位不變,其他位按位取反,
補碼等于反碼+1
例:求-10的原碼反碼補碼
-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 反碼+1,

即0X FF FF FF F6,轉換為2進制:1111 1111 1111 1111 1111 1111 1111 0110
3.浮點型在記憶體中的存盤
根據國際標準IEEE(電氣與電子工程協會)754,任意一個二進制浮點數可以表示成以下的形式
(-1)^S * M * 2^E
(-1)^S 表示符號位,當s=0時為正數,當s=1時為負數,
M表示有效數字,1<M<2;
2^E表示指數位,
對于32位浮點數,最高的一位是符號位S,接著是8個指數位M,最后的23位為有效數字M
對于64位浮點數,最高的一位是符號位S,接著是11個指數位E,最后的52位為有效數字M
示例:
單精度浮點型變數10.125在記憶體中的存盤方式
雙精度浮點型變數10.125在記憶體中的存盤方式
10.125的二進制形式為:
1010.001<=>(-1)^0 * 1.010001 * 2^3
由此可得S=0;M=1.010001;在單精度情況下E=127+3;在雙精度情況下E=1023+3
單精度浮點數存盤為:
0 10000010 10100010000000000000000
轉換為16進制為 :0X41 22 00 00
雙精度浮點數存盤為:
0 10000000010 1010001000000000000000000000000000000000000000000000
轉換為16進制為:0X40 24 40 00 00 00 00 00
4.資料在大端和小端中的存盤方式
什么是大端小端?
大端(存盤模式):指資料的低位保存在記憶體的高地址中,高位保存在記憶體的低地址中,
小端(存盤模式):指資料的高位保存在記憶體的高地址中,低位保存在記憶體的低地址中,
如何判斷一臺機器是大端存盤模式還是小端存盤模式?
思路:定義一個所占記憶體為四個位元組的整型變數,利用指向所占記憶體為一個位元組的字符變數指標去讀取整型變數的第一個位元組,,從而判斷存盤模式
#include<stdio.h>
int check_system()
{
int i=1;
return (*(char*)&i);
}
int main()
{
int ret=check_system();
if(ret==1)
printf("小端模式\n");
else
printf("大端模式\n");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/276185.html
標籤:其他
上一篇:計算機圖形學直線演算法(DDA,中點畫線 ,Bresenham.VS2019 )
下一篇:深入淺出快取和緩沖的異同



