2013-12-12 54 views

回答

4

因为char含蓄是signed char你的平台上。

printf("%d\n", ((int)(unsigned char)200)); 

得到

200 
+0

或者更好的是,'的printf( “%d \ n” 个,200)的8位签名;'。 – Lundin

+1

或者我想,如果你的心情很疯狂,'printf(“200”);'。 – Lundin

1

数量200超出值范围为signed char。它以二进制补码方式环绕到负值范围。

很明显,在您的平台上,char的(隐含)签名被定义为signed。请注意,这不是标准要求的。如果是unsigned,你的程序将打印200有关此主题的更多阅读:

显然,char类型的大小是你的平台上8位。这个数量的定义也没有被语言规范指定。如果它更大,该程序可能会很好地打印200个,就像您预期的那样。有关此主题的进一步阅读:

还要注意,它不是由整数类型必须使用二进制补码表示的标准规定。在另一个平台上,演员甚至可能会产生完全不同的结果。进一步阅读:

+1

但是OP使用'char',而不是'signed char'。 char的签名是实现定义的,所以这个答案不完整。 – Lundin

+0

我不认为应该引用http://stackoverflow.com/q/17045231/1025391的解释“演员甚至可能会产生完全不同的结果”。链接的问题是关于表示。对'T1'类型的'T1'强制转换的语义与'T1'或'T2'的表示无关。 –

+0

@PascalCuoq我认为现在我发现了一个更好的参考。 – moooeeeep

1

charsignedintsigned(默认情况下你的平台上)。

(signed char)11001000 = -56小数

(signed int)0000000011001000 = 200十进制

看一看Signed number representations

+1

没有。 char被签名,所以当编译器强制转换为int时,它会执行符号扩展,因此11001000被转换为11111111111111111111111111001000(对于32位int) –

+1

这仍然不正确。 'char'在他的平台上签名,'int'也是。 – NaotaSang

+0

此外,十六进制代码是完全废话。你想写BCD还是什么?或者“BCH”我想..二进制编码的十六进制? – Lundin

3
  • 类型char朝向C语言的其余部分不一致,因为char可以是无论是签名还是未签名。 C标准将其定义为实现定义的行为,这意味着编译器可以以任何方式实现它。您的特定编译器似乎执行char等于signed char

  • 由于上述原因,char不应该用于其他字符串。用于算术运算是不好的做法。这样的代码依赖于impl.defined行为。

  • int类型始终等于signed int。这是C标准所要求的。

  • 因此,在您的特定系统上,您编写的代码等于:(signed int)(signed char)200

  • 当您尝试将值200存储在相当于signed char的变量中时,它将溢出并被解释为-56(在二进制补码系统上)。

  • 当您将包含-56的signed char投射到signed int时,您将得到-56。

0

炭是从-128〜127,从而200超出该数值范围

相关问题