我无法识别以下程序是如何输出6和-250的。
#include<stdio.h>
int main()
{
unsigned char p=-250;
printf("%d",p);
unsigned int p1=-250;
printf("%d",p1);
return 0;
}作为一个无符号整数,它只需要输出正的values.How,p的值输出6?请帮我理解一下。
发布于 2011-08-22 00:55:26
printf不是类型安全的。它会打印您要求的任何内容,%d会显示"signed integer“。提供匹配类型的变量是您的责任。由于unsigned char只有8位宽,因此文字-250环绕为+6,当解释为带符号整数时,该值仍为+6。请注意,当通过可变参数传递时,char和short int (以及它们的已签名/未签名副本)都会被提升为int-types。
发布于 2011-08-22 01:33:37
默认情况下,-250等integer numerals的类型为int。另外,负值存储在内存中的Two's complement form中。让我们计算二的补语形式为-250 (参见在wiki中制作二的补语形式段落):
250是11111010 (前8位,前导0为omitted)11111010 00000101 (前8位,前导1省略)00000110 (前8位,前导1省略)C中整数类型的类型转换规则告诉我们,我们应该删除左边的位,以获得8位字符。更多细节请看K&R A.6.2 (嗯,这是俄文版的,也许在原著中有另一个地方)。
所以unsigned char p恰好得到一个十进制的00000110值(十进制的6)。这就是为什么你会在输出中得到6。
我想,您现在明白为什么第二个printf中有-250了;)
发布于 2011-08-22 00:54:12
unsigned char可以只由数字组成,0..255数字是以256为模转换的。所以-250给了6一个角色
你不应该相信这种行为。你应该避免溢出。
在p1中,它被强制转换为unsigned int,但在printf()中由于%d标识符而被打断为p1
https://stackoverflow.com/questions/7139658
复制相似问题