簡體   English   中英

int到char cast

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM