《程序設(shè)計實踐》第9章中提到,,“大端”和“小端”可以追溯到1726年的JonathanSwift的《格列佛游記》,,其中一篇講到有兩個國家因為吃雞蛋究竟是先打破較大的一端還是先打破較小的一端而爭執(zhí)不休,甚至爆發(fā)了戰(zhàn)爭。1981年10月,,Danny Cohen的文章《論圣戰(zhàn)以及對和平的祈禱》(On holy wars and a plea for peace)將這一對詞語引入了計算機(jī)界,。這么看來,,所謂大端和小端,,也就是big-endian和little-endian,,其實是從描述雞蛋的部位而引申到計算機(jī)地址的描述,在計算機(jī)系統(tǒng)中,,數(shù)據(jù)的存放是以byte為單位的,,每個內(nèi)存地址存放一個byte的數(shù)據(jù)。但是在C語言中除了1byte的char之外,,還有int,、float、double等數(shù)據(jù)類型,,其占字節(jié)數(shù)大于1byte,,具體大小由編譯器和CPU決定。對于位數(shù)大于8bit的處理器,,例如16位或者32位的處理器,,由于寄存器寬度大于一byte,那么必然存在著一個如何將多個字節(jié)安排的問題,。因此就導(dǎo)致了大端存儲模式和小端存儲模式,。小端模式(Litte-Endian):數(shù)據(jù)中的高位放置在內(nèi)存的高地址,數(shù)據(jù)的低位放置在內(nèi)存的低地址,。大端模式(Big-Endian): 數(shù)據(jù)中的高位放置在內(nèi)存的低地址,,數(shù)據(jù)的低位放置在內(nèi)存的高地址。上面的表述比較繞,,下面通過一個例子來說明大端模式和小端模式,比如內(nèi)存中需要存放0x11223344這個數(shù)據(jù),,那么在大端小段下的存放是怎么樣的呢,如下表:通常CPU設(shè)計過程中就設(shè)定好了大小端的模式,,比如PowerPC .IBM為大端模式,,X86、TC27x為小端模式,,ARM即可為大端,,也可以小端模式那在我們懶得去查手冊的時候,我們可以通過簡單的代碼來確定CPU的工作模式,。int?main(void) { union{ int num; char ch; } data;
data.num = 1;
if(data.ch == 1){ printf("Little-endian\n"); }else{ printf("Big-endian\n"); } return 0; } 通過利用聯(lián)合體中各成員公用一段內(nèi)存,data.num?=1 是數(shù)據(jù)的低位,,如果 1 被存儲在 data 的低字節(jié),,則data.ch 也為1,則為小端模式,,如果 1 被存儲在 data 的高字節(jié),,這個時候 data.ch 的值就是 0,則為大端模式,。參考:本文參考網(wǎng)絡(luò)資源,,侵刪。
|