① 大端位元組順序和小端位元組順序有什麼區別
什麼是大/小端呢?所謂大端就是指高位值在內存中放低位地址,所謂小端是指低位值在內存中放低位地址。比如0x11223344在大端機上是11223344,在小端機上是44332211,而一個機器是大端還是小端要看cpu類型以及運行在上面的操作系統。同一款cpu在不同的操作系統使用的大小端情況是不同的。當然我們通常使用的x86+windows是小端。
那如何測試大小端呢?
通常的技巧是使用一個指針:如:
[cpp]
view
plain
int
x
=
1;
if(*(char
*)&x
==
1)
printf("little-endian\n");
else
printf("big-endian\n");
或者使用union的特性。union是一個聯合體,所有變數公用一塊內存,只是在不同的時候解釋不同。其在內存中存儲是按最長的那個變數所需要的位數來開辟內存的。如:
[cpp]
view
plain
#include
using
namespace
std;
union
{
int
number;
char
s;
}uniontest;
bool
isbigendin()
{
uniontest.number
=
0x01000002;
return
(uniontest.s
==
0x01);
}
void
main()
{
if
(isbigendin())
cout<<"big-endian"<
評論
0
0
載入更多
② 大小端位元組序存在的意義,為什麼不用一個標
因為大小端都有很多應用,cpu很多也能在這兩種標准之間切換。
比如,常見的pc機是小端存儲,但TCP/IP協議中數據是按照大端格式存放的,兩者統一出現在pc機上,能保證運行無誤。
沒有必要做統一標準的工作,即使做了,也一定要兼容以前的兩個標准。
③ 什麼是存儲多位元組數據的小端方式
例如數字 0x2345 在內存中存儲的時候低地址存45,高地址存23。
詳細敘述如下:
Big-Endian和Little-Endian的定義如下:
1) Little-Endian就是低位位元組排放在內存的低地址端,高位位元組排放在內存的高地址端。
2) Big-Endian就是高位位元組排放在內存的低地址端,低位位元組排放在內存的高地址端。
舉一個例子,比如數字0x12 34 56 78在內存中的表示形式為:
1)大端模式:
低地址 -----------------> 高地址
0x12 | 0x34 | 0x56 | 0x78
2)小端模式:
低地址 ------------------> 高地址
0x78 | 0x56 | 0x34 | 0x12
④ 大端和小端存儲法是什麼兩者有什麼區別
小端:較高的有效位元組存放在較高的的存儲器地址,較低的有效位元組存放在較低的存儲器地址。
大端:較高的有效位元組存放在較低的存儲器地址,較低的有效位元組存放在較高的存儲器地址。
大端模式就是低位存放在高地址上。高位存放在地址上。
小端模式就是地位存放在低地址上。高位存放在高地址上。
例如,16bit寬的數0x1234在Little-endian模式CPU內存中的存放方式(假設從地址0x4000開始存放)為:
內存地址 0x4000 0x4001
存放內容 0x34 0x12
而在Big-endian模式CPU內存中的存放方式則為:
內存地址 0x4000 0x4001
存放內容 0x12 0x34
⑤ 大小端位元組序是不是只存在內存中,文件中不存在這個問題
要看用什麼方式生成文件:
小端設備用fwrite(&i32_value, sizeof(i32_value), 1, fp)存儲,文件內容一樣是小端。
下次如果在本機用fread讀取則結果正確,換大端設備讀取同一個文件結果就不對了。
編寫文件系統、資料庫時經常遇到這種問題。
⑥ 一個佔四位元組的正整數,在內存中的存儲方式是低8位在前(第一個位元組),高8位在後(第四個位元組)嗎
位元組順序是指占內存多於一個位元組類型的數據在內存中的存放順序,通常有小端、大端兩種位元組順序。小端位元組序指低位元組數據存放在內存低地址處,高位元組數據存放在內存高地址處;大端位元組序是高位元組數據存放在低地址處,低位元組數據存放在高地址處。
你說的這張存儲方式,是小端位元組序。
⑦ ARM 920T 體系結構 支持兩種方法存儲字數據,大端格式和小端格式。這里什麼是大端和小端格式什麼是字數
大端格式和小端格式是兩種存儲字數據的方法。具體講是在ARM體系的嵌入式系統結構中存儲器存放數據的兩種叫法,在嵌入式體系結構中將存儲器看作是從零地址開始的位元組的線性組合。從第0~3位元組放置第一個存儲的字數據,從第4~7位元組放置第二個存儲的字數據,依次排序。作為32位的微處理器,ARM體系結構可支持最大定址4GB(2^32位元組)。
大端格式是指字數據的高位元組放置在地地址中,而低位元組數據放置在高地址中。
小端格式是指字數據的高位元組放置在高地址中,而低位元組數據放置在地地址中。
ARM中一個字數據是4個位元組即32位的數據.。在存儲器中每個地址存放一個位元組。
例如:在內存中雙字0x01020304(DWORD)的存儲方式。 內存地址 4000 4001 4002 4003 小端格式是: 04 03 02 01 大端格式是: 01 02 03 04
微機原理講的一般是8086/8088體系結構,x86系列的CPU都是小端格式的位元組排序。
⑧ 低位元組序,什麼是高位元組序
網路位元組序與主機位元組序
不同的CPU有不同的位元組序類型 這些位元組序是指整數在內存中保存的順序 這個叫做主機序
最常見的有兩種
1. Little endian:將低序位元組存儲在起始地址
2. Big endian:將高序位元組存儲在起始地址
LE little-endian
最符合人的思維的位元組序
地址低位存儲值的低位
地址高位存儲值的高位
怎麼講是最符合人的思維的位元組序,是因為從人的第一觀感來說
低位值小,就應該放在內存地址小的地方,也即內存地址低位
反之,高位值就應該放在內存地址大的地方,也即內存地址高位
BE big-endian
最直觀的位元組序
地址低位存儲值的高位
地址高位存儲值的低位
為什麼說直觀,不要考慮對應關系
只需要把內存地址從左到右按照由低到高的順序寫出
把值按照通常的高位到低位的順序寫出
兩者對照,一個位元組一個位元組的填充進去
例子:在內存中雙字0x01020304(DWORD)的存儲方式
內存地址
4000 4001 4002 4003
LE 04 03 02 01
BE 01 02 03 04
例子:如果我們將0x1234abcd寫入到以0x0000開始的內存中,則結果為
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
x86系列CPU都是little-endian的位元組序.
網路位元組順序是TCP/IP中規定好的一種數據表示格式,它與具體的CPU類型、操作系統等無關,從而可以保證數據在不同主機之間傳輸時能夠被正確解釋。網路位元組順序採用big endian排序方式。
為了進行轉換 bsd socket提供了轉換的函數 有下面四個
htons 把unsigned short類型從主機序轉換到網路序
htonl 把unsigned long類型從主機序轉換到網路序
ntohs 把unsigned short類型從網路序轉換到主機序
ntohl 把unsigned long類型從網路序轉換到主機序
在使用little endian的系統中 這些函數會把位元組序進行轉換
在使用big endian類型的系統中 這些函數會定義成空宏
同樣 在網路程序開發時 或是跨平台開發時 也應該注意保證只用一種位元組序 不然兩方的解釋不一樣就會產生bug.
註:
1、網路與主機位元組轉換函數:htons ntohs htonl ntohl (s 就是short l是long h是host n是network)
2、不同的CPU上運行不同的操作系統,位元組序也是不同的,參見下表。
處理器 操作系統 位元組排序
Alpha 全部 Little endian
HP-PA NT Little endian
HP-PA UNIX Big endian
Intelx86 全部 Little endian <-----x86系統是小端位元組序系統
Motorola680x() 全部 Big endian
MIPS NT Little endian
MIPS UNIX Big endian
PowerPC NT Little endian
PowerPC 非NT Big endian <-----PPC系統是大端位元組序系統
RS/6000 UNIX Big endian
SPARC UNIX Big endian
IXP1200 ARM核心 全部 Little endian
⑨ 大端存儲方式和小端存儲方式的區別
採用大小模式對數據進行存放的主要區別在於在存放的位元組順序,大端方式將高位存放在低地址,小端方式將低位存放在高地址。採用大端方式進行數據存放符合人類的正常思維,而採用小端方式進行數據存放利於計算機處理。到目前為止,採用大端或者小端進行數據存放,其孰優孰劣也沒有定論。
⑩ 位元組數組何為大端模式和小端模式
大端模式和小端模式一般是指多位元組數據的存儲方式
當多位元組數據存儲時,如果以位元組數組的方式來查看時,會發現兩種模式有不同的存儲方式
舉例:短整型數0x1234,存放在內存中,地址是8000H
大端模式: 數據高位位元組先存
8000H:0x12
8001H:0x34
小端模式: 先存放數據的低位位元組
8000H:0x34
8001H:0x12