2016-01-13 34 views
0

我覺得冠軍是非常自我解釋,但基本上是我想說的是,如果我有以下指令:將unsigned char轉換爲char會導致不同的二進制表示形式?

a = (char) b; 

知道a的類型是charb的是unsigned char,可以該指令導致ab有不同的二進制表示?

+0

標題除了不言自明外,其他都不是。這幾乎沒有解釋。 –

+0

@KerrekSB好的,感謝您的編輯,但你能否幫助我? :) –

+0

我不知道它是否定義好,但我不會改變二進制表示。即使'char'等於'signed char'與你的編譯器。 – JojOatXGME

回答

1

一般答案是否定的,沒有任何區別。在這裏你可以自己測試它。只需提供「a」和「b」的相應值即可。

#include <stdio.h> 
#include <string.h> 

const char *byte_to_binary(int x) 
{ 
    static char b[9]; 
    b[0] = '\0'; 

    int z; 
    for (z = 128; z > 0; z >>= 1) 
     strcat(b, ((x & z) == z) ? "1" : "0"); 
    } 

    return b; 
} 


int main(void) { 
    unsigned char b = -7; 
    char a = -7; 
    printf("1. %s\n", byte_to_binary(a)); 
    a = (char) b; 
    printf("2. %s\n", byte_to_binary(a)); 
    return 0; 
} 
+0

我試過了,'a'的二進制值總是和'b'一樣。如果值是255,什麼可以,並且會不同,是十進制表示,對吧?在簽名字符中,255表示爲-1。 –

+0

有符號的字符從-127到128. -1幾乎**總是**錯誤返回值。只有無符號的範圍是0到255. – user8

+1

對不起,這並不能證明任何東西。結果是定義了實現,因此它可能只適用於你,但不一定是所有的實現。 –

4

類型char可以是有符號的或無符號的。字符類型沒有填充,所以所有位都是有效位。

  • 如果char是無符號的,則a值的位將是相同的b

  • 如果char簽署,然後...

    • 如果b值表示的是由charab共同的價值位將是相同的。
    • 否則,從不可表示的unsigned char值到char的轉換導致實現定義的結果。
+0

是的,我知道如果'char'是無符號的,會導致相同的二進制表示,我懷疑是在簽名後會發生什麼,因爲這意味着它具有較少的「空間」,因爲它必須有標誌。 –

+0

你確定'char'可能沒有填充位? – fuz

+0

@FUZxxl:C11,6.2.6.2/1。 –

相關問題