我覺得冠軍是非常自我解釋,但基本上是我想說的是,如果我有以下指令:將unsigned char轉換爲char會導致不同的二進制表示形式?
a = (char) b;
知道a
的類型是char
和b
的是unsigned char
,可以該指令導致a
和b
有不同的二進制表示?
我覺得冠軍是非常自我解釋,但基本上是我想說的是,如果我有以下指令:將unsigned char轉換爲char會導致不同的二進制表示形式?
a = (char) b;
知道a
的類型是char
和b
的是unsigned char
,可以該指令導致a
和b
有不同的二進制表示?
一般答案是否定的,沒有任何區別。在這裏你可以自己測試它。只需提供「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;
}
我試過了,'a'的二進制值總是和'b'一樣。如果值是255,什麼可以,並且會不同,是十進制表示,對吧?在簽名字符中,255表示爲-1。 –
有符號的字符從-127到128. -1幾乎**總是**錯誤返回值。只有無符號的範圍是0到255. – user8
對不起,這並不能證明任何東西。結果是定義了實現,因此它可能只適用於你,但不一定是所有的實現。 –
類型char
可以是有符號的或無符號的。字符類型沒有填充,所以所有位都是有效位。
如果char
是無符號的,則a
值的位將是相同的b
。
如果char
簽署,然後...
b
值表示的是由char
的a
和b
共同的價值位將是相同的。unsigned char
值到char
的轉換導致實現定義的結果。是的,我知道如果'char'是無符號的,會導致相同的二進制表示,我懷疑是在簽名後會發生什麼,因爲這意味着它具有較少的「空間」,因爲它必須有標誌。 –
你確定'char'可能沒有填充位? – fuz
@FUZxxl:C11,6.2.6.2/1。 –
標題除了不言自明外,其他都不是。這幾乎沒有解釋。 –
@KerrekSB好的,感謝您的編輯,但你能否幫助我? :) –
我不知道它是否定義好,但我不會改變二進制表示。即使'char'等於'signed char'與你的編譯器。 – JojOatXGME