可能重複:
Detecting endianness programmatically in a C++ program如何以編程方式使用C查找我的PC的Endian-ness?
有什麼庫函數可用來找到我的電腦的字節序?
可能重複:
Detecting endianness programmatically in a C++ program如何以編程方式使用C查找我的PC的Endian-ness?
有什麼庫函數可用來找到我的電腦的字節序?
爲什麼你需要一個圖書館,如果你能找到它這樣? :)
int num = 1;
if (*(char *)&num == 1)
{
printf("Little-Endian\n");
}
else
{
printf("Big-Endian\n");
}
我不知道庫函數。
您可以獲取整數的地址,然後將該地址視爲字符指針並將數據寫入組成該整數的字節。然後,讀出整數中的實際內容,看看是否得到與大端或小端架構一致的結果。
這樣做沒有標準功能(如C標準或POSIX標準)。
如果您的電腦是運行英特爾(Windows風格)的個人電腦,它是小端。
如果你想找到你的機器上的字節順序,可以使用不能完全定義的行爲(但它通常工作 - 我沒有聽說過的任何地方,它不工作),這種技術:
enum { BigEndian, LittleEndian };
int endianness(void)
{
union
{
int i;
char b[sizeof(int)];
} u;
u.i = 0x01020304;
return (u.b[0] == 0x01) ? BigEndian : LittleEndian;
}
此代碼確實假定32位int
類型(而不是64位或16位)。
爲什麼不'u.i = 1;返回u.b [0] == 1? LittleEndian:BigEndian;'?這樣你就不必擔心int大小。 – 2016-09-27 10:41:48
@MartinBonner:那也可以。 – 2016-09-27 13:26:38
使用此代碼:
union
{
uint8 c[4];
uint32 i;
} u;
u.i = 0x01020304;
if (0x04 == u.c[0])
printf("Little endian\n");
else if (0x01 == u.c[0])
printf("Big endian\n");
您不需要「else if」 - 「else」就足夠了如果它不是很小的話,那就是很大的問題。 – Artur 2016-02-28 17:37:38
@Artur:哈哈哈哈!還有其他的選擇:PDP11以big-endian的順序使用16位字......小字節順序中的字節(它可能反之亦然 - 剛纔是現在)。 – 2016-09-27 10:39:23
也許可以解釋爲什麼這個工程像@Eric J.低於 – bjackfly 2013-08-09 04:00:45
int num = 1將根據字節順序存儲爲000.0001或100.000。 (char *)&num將指向該int的第一個字節。現在如果該字節讀取1,那麼它的小端序列或其他大端序列。 – hasanatkazmi 2014-04-17 02:25:43
@hasanatkazmi你怎麼知道計算機是以2字節還是4字節存儲數字?另外,爲什麼你使用7位呢? – 2016-01-20 18:33:06