7

当我在下面运行程序时,它会输出 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);
   }
4

9 回答 9

8

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

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

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

于 2013-03-11T13:59:39.983 回答
2

格式字符串将%d替换值视为带int符号的 。

于 2013-03-11T13:57:42.060 回答
2

为什么这样?

因为你的程序有一个未定义的行为(使用%dwhich is forint打印一个unsigned) - 所以你可以期待任何事情发生。

为什么是无限循环?因为 anunsigned int总是>= 0

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

这是一个……无符号整数。一个非负的整数。

于 2013-03-11T14:00:50.107 回答
1

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

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

使用%u.

于 2013-03-11T13:58:56.830 回答
1

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

于 2013-03-11T14:00:09.407 回答
0

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

于 2013-03-11T13:59:00.267 回答
0

您应该在 printf 中%u用作格式说明符,否则该值将转换为int.

于 2013-03-11T13:59:50.467 回答
0

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

于 2013-03-11T14:01:25.030 回答
0

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

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

于 2013-03-11T14:00:02.230 回答