2012-09-28 25 views
0

在我的機器上,以下程序將1234寫入輸出。字符串文字的字節順序和case語句中字符串的使用

const char str[] = "1234"; 
printf("%c%c%c%c\n", 
    (int) (0xff & (*(uint32_t*) str) >> 0), 
    (int) (0xff & (*(uint32_t*) str) >> 8), 
    (int) (0xff & (*(uint32_t*) str) >> 16), 
    (int) (0xff & (*(uint32_t*) str) >> 24)); 

這意味着str在內部表示爲0x34333231,和第一字節str[0]表示至少顯著8位。

這是否意味着str編碼在小端?並且這個程序的輸出依賴於平臺嗎?

另外,有沒有一個方便的方法來在switch case語句中使用1,2,4和8個字符串文字?我無法找到任何方法將字符串轉換爲整數,因爲*(const uint32_t* const) "1234"不是一個常量表達式,並且0x34333231/0x31323334可能是平臺相關的,必須用十六進制表示。

編輯:

換句話說,是0xff & *(uint32_t*) str總是等於str[0]

呃,沒關係,只是意識到它是,也是爲什麼。

回答

2

字節順序是指字節的大小順序。字符串(至少在C和C++中)是一個字節數組,因此不適用Endianness。

實際上,您可以使用多字符文字做最後一段中提到的內容,不過它的實現定義了它是如何工作的,而且字符串必須不超過sizeof(int)

C++標準,§2.14.3/ 1 - 字符文字

(...)文字普通字符包含一個以上的c-char是一個多字符字面。多字符文字具有int類型和實現定義的值。

例如,'abcd'int類型的一實現定義的值的值。這個值可能取決於字節順序。由於它是一個整數,你可以打開它。

+0

謝謝你,這就是我一直在尋找。但是8字符文字呢?這是我的機器上的字大小,但它大於'int'的大小。 – RPFeltz

+0

@RPFeltz只有當你的編譯器有一個擴展來做到這一點。按照標準,字符文字總是int。 –

4

你把一個字符串的字節序(只要我們談論ASCII字符串時不存在)與一個整數的字節序性混淆在一起。你的系統上的整數是小尾數。

要回答你的第二個問題,你不能打開字符串。如果你真的急於提高速度,你可以爲小端系統和大端系統做一個。

0

這些字節按照0x31,0x32,0x33,0x34這些增加的內存地址排列。

在一個32位整數是小端,你得到0x34333231。如果大端爲0x31323334。

(也用普通整數在偶或4倍的地址一致。)

相關問題