此代码打印-56
,我不知道为什么有人可以告诉我为什么这个程序打印-56吗?
#include<stdio.h>
main()
{
printf("%d\n", ((int)(char)200));
}
此代码打印-56
,我不知道为什么有人可以告诉我为什么这个程序打印-56吗?
#include<stdio.h>
main()
{
printf("%d\n", ((int)(char)200));
}
因为char
含蓄是signed char
你的平台上。
做
printf("%d\n", ((int)(unsigned char)200));
得到
200
数量200超出值范围为signed char
。它以二进制补码方式环绕到负值范围。
很明显,在您的平台上,char
的(隐含)签名被定义为signed
。请注意,这不是标准要求的。如果是unsigned
,你的程序将打印200有关此主题的更多阅读:
显然,char
类型的大小是你的平台上8位。这个数量的定义也没有被语言规范指定。如果它更大,该程序可能会很好地打印200个,就像您预期的那样。有关此主题的进一步阅读:
还要注意,它不是由整数类型必须使用二进制补码表示的标准规定。在另一个平台上,演员甚至可能会产生完全不同的结果。进一步阅读:
char
是signed
和int
是signed
(默认情况下你的平台上)。
(signed char)11001000
= -56小数
(signed int)0000000011001000
= 200十进制
类型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。
炭是从-128〜127,从而200超出该数值范围
或者更好的是,'的printf( “%d \ n” 个,200)的8位签名;'。 – Lundin
或者我想,如果你的心情很疯狂,'printf(“200”);'。 – Lundin