-250打印为6

时间:2011-08-21 16:51:33

标签: c

我无法确定以下程序如何输出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?请帮我理解。

4 个答案:

答案 0 :(得分:5)

printf 不是类型安全。它打印您要求的任何内容,%d表示“有符号整数”。提供匹配类型的变量是 的责任。由于unsigned char只有8位宽,因此文字-250回绕到+6,当解释为有符号整数时,它仍为+6。请注意,charshort int(及其签名/未签名的对应方)在通过可变参数传递时都会被提升为int类型。

答案 1 :(得分:3)

默认情况下,-250(例如int)的类型为250。此外,负值存储在integer numerals的内存中。让我们计算-250的二进制补码形式(参见wiki中的制作二进制补码段):

  1. 肯定1111101000000101(前8位,前导省略)
  2. 补充它并得到00000110(前8位,前导 1 被省略)
  3. 添加一个并获取unsigned char p(前8位,前导 1 被省略)
  4. 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()标识符而在%d中作为p1进行了interpried

答案 3 :(得分:2)

p1unsigned,但%d修饰符会将相应的参数视为已签名,因此即使实际上它是正数,也会将其打印为负数。

数字是有符号还是无符号是关于所应用的表示,在机器级别它没有任何区别。