以前一直知道大小端,很久不做題又把大端和小端記混了,這次來總結一下,以後再也不會混了。
一:什麼是大小端
大端模式,是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;這和我們的閱讀習慣一致。
小端模式,是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低。
口訣:大相反(低位存高位),小相同(低位存低位),叉八六(x86計算機),必小端。
舉例:假如乙個int型別數,十六進製制(就是給人看的)表示為:
0x0026f800
大小端是以位元組為單位的,因為記憶體中最小單元就是位元組。
二:一道面試題
結果為:266
#include
typedef
union un un;
intmain
()
解析:10 相當於 0000 1010 低位址
1 相當於 0000 0001 高位址
由於x86都是小端,所以在計算機上執行輸出266;
三:另外乙個聯合體題,不涉及大小端
這個輸出結果為: -16, 1
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
struct
aa
aa;int
main
()
為什麼呢?
首先sizeof(aa)的大小為4,b1和b2分別佔5bit和2bit.經過strcpy和memcpy後,aa的4個位元組所存放的值是: 0,1,2,3的asc碼,即00110000,00110001,00110010,00110011所以,最後一步:顯示的是這4個位元組的前5位,和 之後的2位分別為:10000,和01 。又因為位域擴充套件時,會以最高位作為符號位擴充套件,
10000 擴充套件為 1111 0000 16位機器, 符號為為1,負數需要轉化成原碼,方法為:符號為不變,其餘位按位取反再加1,結果為-16。
01 擴充套件為 0000 0001 ,正數不變,就是01。
union聯合體學習
union,中文名 聯合體 共用體 在某種程度上類似結構體struct的一種資料結構,共用體 union 和結構體 struct 同樣可以包含很多種資料型別和變數。不過區別也挺明顯 結構體 struct 中所有變數是 共存 的 優點是 有容乃大 全面 缺點是struct記憶體空間的分配是粗放的,不管...
聯合體union筆記
當多個資料需要共享記憶體或者多個資料每次只取其一時,可以利用聯合體 union 1 聯合體是乙個結構 2 它的所有成員相對於基位址的偏移量都為0 3 此結構空間要大到足夠容納最 寬 的成員 4 其對齊方式要適合其中所有的成員 下面解釋這四條描述 由於聯合體中的所有成員是共享一段記憶體的,因此每個成員...
union聯合體學習
union,中文名 聯合體 共用體 在某種程度上類似結構體struct的一種資料結構,共用體 union 和結構體 struct 同樣可以包含很多種資料型別和變數。不過區別也挺明顯 結構體 struct 中所有變數是 共存 的 優點是 有容乃大 全面 缺點是struct記憶體空間的分配是粗放的,不管...