C中的无符号整数

时间:2013-03-11 13:56:00

标签: c unsigned-integer

当我在运行下面的程序时,它输出如109876543210-1-2-3-4-5-6-78-9-10-11-12-and s0 on。为什么这样?无符号整数的概念是什么?

 main ()
   {
      unsigned int i;
       for (i = 10; i >= 0; i--)
                 printf ("%d", i);
   }

9 个答案:

答案 0 :(得分:5)

无符号整数总是非负的,大于或等于0.当你在无符号整数类型中从0减去1时,最终得到MAX_INT。

因此,你的for循环永远不会终止。

但是,如果您希望打印无符号值而不是有符号值,则需要在printf中使用“%u”而不是“%d”。

答案 1 :(得分:2)

%d格式字符串将替换值视为已签名的int

答案 2 :(得分:2)

  

为什么会这样?

因为您的程序有一个未定义的行为(使用%d用于int打印unsigned) - 所以您可以预期会发生任何事情。

为什么无限循环?因为unsigned int始终为>= 0

  

无符号整数的概念是什么?

它是一个...... 无符号整数。一个非负数的整数。

答案 3 :(得分:1)

您使用%d,因此printf将值解释为已签名。 与无符号的零(> = 0)的比较始终为真。

因此,当值从10到0时,输出正常(109876543210)。之后,该值变为巨大的正值(最大值,对于32位int,它是0xFFFFFFFF)。与0的比较是正确的,因此循环继续。但是printf 0xFFFFFFFF生成-1,因为使用了%d。然后循环继续0xFFFFFFFE-2>= 0仍为无符号。

使用%u

答案 4 :(得分:1)

printf无法知道你给它的变量的类型,它得到的只是值(位本身)。您必须告诉它如何解释该值,并使用%d告诉它将其解释为有符号整数。

答案 5 :(得分:0)

您正在使用带有printf()的“%d”,这是有符号整数的格式说明符。

答案 6 :(得分:0)

您应该在printf中使用%u作为format specifier,否则将值投放到int

答案 7 :(得分:0)

声明unsigned integer指示编译器对变量使用无符号运算。例如,>>运算符对无符号整数与有符号整数的行为不同(具体而言,是否应保留符号位)。

要打印无符号整数,您应使用%u格式。

答案 8 :(得分:0)

有符号整数(我们将使用16位)范围从-32768到32767(0x8000到0x7FFF),而无符号整数范围从0到65535(0x0000到0xFFFF)。所以无符号整数不能有负值,这就是你的循环永远不会终止的原因。但是,您已告知打印程序将输出格式化为已签名%d),以便您在其中看到格式为负值的数字输出。在某种程度上,计算机中的所有内容都只是一串需要解释的位,您的代码示例使用相同位模式的两种不同解释...您的unsigned int。