[英]int to char casting
int i = 259; /* 03010000 in Little Endian ; 00000103 in Big Endian */
char c = (char)i; /* returns 03 in both Little and Big Endian?? */
在我的計算機中它將03分配給char c並且我有Little Endian,但我不知道char轉換是讀取最低有效字節還是讀取i變量指向的字節。
Endianness實際上並沒有改變任何東西。 它不會嘗試存儲其中一個字節(MSB,LSB等)。
char
是無符號的,它將會回繞。 假設8位字符259%256 = 3 char
已簽名,則結果是實現定義的。 謝謝pmg :C99標准中的6.3.1.3/3 由於您從較大的整數類型轉換為較小的整數類型,因此無論字節順序如何,它都是最不重要的部分。 如果你轉換指針代替,不過,這將需要在地址字節,這將取決於端標記。
所以c = (char)i
將最不重要的字節分配給c
,但是c = *((char *)(&i))
會將i
的地址的第一個字節分配給c
,這在一點上都是一樣的 - 僅限印度系統。
如果你想測試小/大端,你可以使用一個聯合:
int isBigEndian (void)
{
union foo {
size_t i;
char cp[sizeof(size_t)];
} u;
u.i = 1;
return *u.cp != 1;
}
它的工作原理是因為在小端,它看起來像01 00 ... 00,但在大端,它將是00 ... 00 01(......由零組成)。 因此,如果第一個字節為0,則測試返回true。 否則返回false。 但要注意,還存在以不同方式存儲數據的混合端機器(有些可以切換字節序;有些只是以不同方式存儲數據)。 PDP-11將32位int存儲為兩個16位字,除了字的順序顛倒(例如0x01234567為4567 0123)。
從int(4個字節)轉換為char(1個字節)時,它將保留最后1個字節。 例如:
int x = 0x3F1; // 0x3F1 = 0000 0011 1111 0001
char y = (char)x; // 1111 0001 --> -15 in decimal (with Two's complement)
char z = (unsigned char)x; // 1111 0001 --> 241 in decimal
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.