2016-01-13 28 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。 –

相关问题