有人能告诉我为什么这个程序打印-56?

时间:2013-12-12 12:26:23

标签: c casting ascii

此代码打印-56,我不知道为什么

#include<stdio.h>

main()
{
    printf("%d\n", ((int)(char)200));
}

5 个答案:

答案 0 :(得分:4)

因为char隐含在您的平台上signed char

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

获取

200

答案 1 :(得分: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。

答案 2 :(得分:1)

数字200超出signed char的值范围。它以二进制补码方式包含在负值范围内。

显然,char的(隐含)签名在您的平台上定义为signed。请注意,标准并未规定这一点。如果是unsigned,您的程序将打印200.有关此主题的进一步阅读:

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

另请注意,标准未指定整数类型必须使用二进制补码表达式。在不同的平台上,演员阵容甚至可能产生完全不同的结果。进一步阅读:

答案 3 :(得分:1)

charsignedintsigned(默认情况下为您的平台)。

(signed char)11001000 = -56十进制

(signed int)0000000011001000 = 200十进制

查看Signed number representations

答案 4 :(得分:0)

char是从-128~127签名的8位,因此200超出了值范围