C語言中大小端問題以及union的使用

2021-08-18 16:52:56 字數 1658 閱讀 8305

大端模式和小端模式

記憶體的最小儲存單元是乙個位元組,即每個位址單元對應乙個位元組,資料的操作都是以位元組為單位,乙個位元組等於8bit

對於32位的編譯器

char:1個位元組 

char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組。同理64位編譯器) 

short int :2個位元組

int: 4個位元組 

unsigned int: 4個位元組 

float: 4個位元組 

double: 8個位元組 

long:4個位元組 

long long: 8個位元組 

unsigned long: 4個位元組

cpu在對記憶體進行資料操作的時候涉及到順序問題,即乙個大於乙個位元組的資料在記憶體中要怎麼擺放,從高位元組部分開始存放,還是從低位元組部分開始存放,這裡涉及到有兩種儲存模式:小端模式 和 大端模式

例1:int a = 0x12345678, 變數a大小為4個位元組,從高到低對應的位元組序為:0x12, 0x34, 0x56, 0x78

此時需要4個記憶體位址單元來存放變數a的四個位元組資料,假設用0x4000~0x4003這四個記憶體位址來存放,

0x4000

0x4001

0x4002

0x4003

0x78

0x56

0x34

0x12

0x4000

0x4001

0x4002

0x4003

0x12

0x34

0x56

0x78

在c++裡,union 的成員預設屬性頁為public。union 主要用來壓縮空間。如果一些資料不可能在同一時間同時被用到,則可以使用union。union 關鍵字的用法與struct 的用法非常類似。

union 維護足夠的空間來置放多個資料成員中的「一種」,而不是為每乙個資料成員配置空間,在union 中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有的資料成員具有相同的起始位址。例子如下:

union statemachine

;乙個union 只配置乙個足夠大的空間以來容納最大長度的資料成員,以上例而言,最大長度是double 型態,所以statemachine 的空間大小就是double 資料型別的大小。

下面再看乙個例子:

union

*p, u;

p =&u;

p->a[0] = 0x39;

p->a[1] = 0x38;

p.i 的值應該為多少呢?

這裡需要考慮儲存模式:大端模式和小端模式。

union 型資料所佔的空間等於其最大的成員所佔的空間。對union 型的成員的訪問都是相對於該聯合體基位址的偏移量為0 處開始,也就是聯合體的訪問不論對哪個變數的訪問都是從union 的首位址位置開始。

mysql 大小端 go語言中大小端模式的個人理解

大端模式 是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料 效地結合起來,高位址部分權值高,低位址部分權值低。這樣的儲存模式有利於計算機處理資料。比如對於資料 0x12345678,從高位元組到低位元組為 12345678,從低位元組...

C語言中的大小端

大小端模式 大端模式 big endian 和小端模式 little endian 串列埠通訊時,一次只能傳送乙個位元組,這時候就有乙個問題,是從0 1還是從1 0.規則就是傳送方和接受方必須按照相同的順序來通訊,否則就會出現錯誤。這就是通訊當中的大小端模式。我們講的實質計算機儲存系統中的大小端。在...

C語言中大數的儲存問題

在c語言中,常見的資料型別有short,int等資料型別,在進行較小數的儲存和表示時是沒有問題的,但是當我們想要進行大數的儲存和表示時,就會出現資料溢位的問題,以求階乘為例,使用int型資料的話,到13的階乘資料就會溢位了,得到的結果為1932053504 使用codeblocks 很明顯是不對的。...