我无法确定以下程序如何输出6和-250。
#include<stdio.h>
int main()
{
unsigned char p=-250;
printf("%d",p);
unsigned int p1=-250;
printf("%d",p1);
return 0;
}
作为无符号整数,它必须只输出正值.p值如何输出6?请帮我理解。
答案 0 :(得分:5)
printf
不是类型安全。它打印您要求的任何内容,%d
表示“有符号整数”。提供匹配类型的变量是 的责任。由于unsigned char
只有8位宽,因此文字-250回绕到+6,当解释为有符号整数时,它仍为+6。请注意,char
和short int
(及其签名/未签名的对应方)在通过可变参数传递时都会被提升为int
类型。
答案 1 :(得分:3)
默认情况下,-250
(例如int
)的类型为250
。此外,负值存储在integer numerals的内存中。让我们计算-250的二进制补码形式(参见wiki中的制作二进制补码段):
11111010
是00000101
(前8位,前导零省略)00000110
(前8位,前导 1 被省略)unsigned char p
(前8位,前导 1 被省略)C中整数类型的类型转换规则表示我们应该删除左位以获得8位字符。有关详细信息,请参阅K&amp; R A.6.2(嗯,这是俄语版,也许在原书中有另一个地方)。
因此00000110
获得了6
值(十进制-250
)。这就是你输出6的原因。
我想,您现在明白为什么printf
中有{{1}}; {/ p>
答案 2 :(得分:2)
unsigned char
可能只包含数字0..255
数字按模256
转换。因此-250
已投放到6
你不应该相信这种行为。你应该避免溢出。
从p1
开始,它已转换为unsigned int,但由于printf()
标识符1>而在%d
中作为p1进行了interpried
答案 3 :(得分:2)
p1
为unsigned
,但%d
修饰符会将相应的参数视为已签名,因此即使实际上它是正数,也会将其打印为负数。
数字是有符号还是无符号是关于所应用的表示,在机器级别它没有任何区别。