大小端模式解析(聯合體union)

2021-08-28 03:25:42 字數 1311 閱讀 6846

以前一直知道大小端,很久不做題又把大端和小端記混了,這次來總結一下,以後再也不會混了。

一:什麼是大小端

大端模式,是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;這和我們的閱讀習慣一致。

小端模式,是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低。

口訣:大相反(低位存高位),小相同(低位存低位),叉八六(x86計算機),必小端。

舉例:假如乙個int型別數,十六進製制(就是給人看的)表示為:

0x0026f800

大小端是以位元組為單位的,因為記憶體中最小單元就是位元組。

二:一道面試題

#include

typedef

union un un;

intmain

()

結果為:266

解析:10 相當於 0000 1010     低位址

1   相當於 0000 0001     高位址

由於x86都是小端,所以在計算機上執行輸出266;

三:另外乙個聯合體題,不涉及大小端

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

struct

aa

aa;int

main

()

這個輸出結果為: -16, 1

為什麼呢?

首先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記憶體空間的分配是粗放的,不管...