此代码打印-56
,我不知道为什么
#include<stdio.h>
main()
{
printf("%d\n", ((int)(char)200));
}
答案 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)
char
为signed
,int
为signed
(默认情况下为您的平台)。
(signed char)11001000
= -56十进制
(signed int)0000000011001000
= 200十进制
答案 4 :(得分:0)
char是从-128~127签名的8位,因此200超出了值范围