我觉得冠军是非常自我解释,但基本上是我想说的是,如果我有以下指令:将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