C語言中資料的存盤-上
由于內容較多,所以分成了兩部分,資料的存盤-下我會盡快趕出來的,贊不贊的無所謂,只希望看到的讀者可以花上您珍貴的幾分鐘看看我所寫得文章,
首先介紹一下資料型別都有哪些
- 整形類
char//其在記憶體中以ASCII碼的形式存盤,ASCII碼為整數,所以歸為整形類
signed char//有符號
unsigned char//無符號
short
signed short
unsigned short
int
signed int
unsigned int
long
signed long
unsigned long
long long
signed long long
unsigned long long
//僅寫出char/short/int/long/long long時通常都會被理解為有符號型
- 浮點型類
float
double
long double
- 構造型別(自定義型別)
陣列型別-例如arr[10]={0}
結構體型別-struct
列舉型別-enum
聯合型別-union
- 指標型別
int *pi;
char *pc;
short *ps;
float *pf;
void *pv;//空型別指標
- 空型別
void表示空型別/無型別
通常應用于函式的回傳型別、函式的引數、指標型別,
創建這些型別的意義是:
- 使用不同型別決定了開辟記憶體空間的大小(空間大小決定適用范圍)
- 型別決定了看待記憶體空間的視角
其次我們先來講解整形在記憶體中的存盤形式
如果要創建一個變數,就需要在記憶體中開辟空間,開辟空間的大小與型別有關,那么接下來我們看看變數到底是如何在記憶體中存盤的,
比如
int a=20;
int b=-10;
我們已經知道a,b會占記憶體四位元組的空間,那它們是如何存盤的呢?
先來了解一下原碼,反碼,補碼的概念,
計算機中的有符號數有三種表示方式,即原碼、反碼和補碼
三種表示方式均有符號位和數值位兩部分,符號位都是用0表示‘“正”,用1表示“負”,而數值位三種表示方式各不相同,
- 原碼:直接將二進制按照正負數的形式翻譯成二進制即可
- 反碼:原碼符號位不變,其他位依次按位取反即可
- 補碼:反碼加一即可
以上是負數求原反補碼的方式,正數的原反補碼相同,
對于整形而言:資料存放于記憶體中其實存放的是補碼
原因是
在計算機系統中,數值一律用補碼來表示和存盤,原因在于,使用補碼可以將符號位和數值域統一處理;同時,加法和減法也可以統一處理(CPU只有加法器)此外,補碼與原碼相互轉換,其運算程序是相同的,不需要額外的硬體電路,
展示一下正數負數例子


那么由此就又衍生出了一個問題,上圖的補碼和記憶體中的存盤順序為什么不同呢?
接下來,為探討這個問題我們再舉個栗子,假設現在要存0x 11 22 33 44這個數字要怎么存呢?

大端位元組序存盤:把一個資料的低位位元組(如上圖第一種)的內容,存放在高地址上;高位位元組的內容,則存放在低地址上,
小端位元組序存盤:把一個資料的低位位元組(如上圖第二種)的內容,存放在低地址上;高位位元組的內容,則存放在高地址上,
這是因為在計算機系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為8bit,但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對于位數大于8位的處理器,例如16位或者32位的處理器,由于暫存器寬度大于一個位元組,那么必然存在著一個如何將多個位元組安排的問題,因此就導致了大端存盤模式和小端存盤模式,
例如一個 16bit 的 short 型 x ,在記憶體中的地址為 0x0010 , x 的值為 0x1122 ,那么 0x11 為高位元組, 0x22為低位元組,對于大端模式,就將 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中,小端模式,剛好相反,我們常用的 X86 結構是小端模式,而 KEIL C51 則為大端模式,很多的ARM,DSP都為小端模式,有些ARM處理器還可以由硬體來選擇是大端模式還是小端模式,
那么在此可以出一個編程小題目:請設計一個程式以判斷當前平臺的存盤方式為大端還是小端?
#include <stdio.h>
int check()
{
int a = 1;
return *(char*)&a;//先將int型別的指標強制轉化為char,再解參考傳回a中第一個位元組資料
}
//上面拆開寫就是這種
//int check()
//{
// int a = 1;
// char *p = (char*)&a;
// return *p;
//}
int main()
{
int a = 1;
if (check() == 1)//如果回傳的是1,就證明低位位元組在低地址上
{
printf("小端\n");
}
else//如果回傳的是0,就證明低位位元組在高地址上
{
printf("大端\n");
}
return 0;
}
C語言資料的存盤-上 至此完,
希望有看到的大佬多多指教,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/267082.html
標籤:其他
上一篇:計算機作業系統學習筆記
下一篇:計算機網路原理【四】之 網路層
