C中的无符号整数

C中的无符号整数,c,unsigned-integer,C,Unsigned Integer,当我运行下面的程序时,它会输出109876543210-1-2-3-4-5-6-78-9-10-11-12和s0 on。为什么会这样?无符号整数的概念是什么 main () { unsigned int i; for (i = 10; i >= 0; i--) printf ("%d", i); } %d格式字符串将替换的值视为已签名的int。您使用%d,因此printf将该值解释为已签名。 与无符号的零(>=0)

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

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

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

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

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


使用
%u

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

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

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


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

您应该在printf中使用
%u
,否则,该值将被强制转换为
int
声明
无符号整数
指示编译器对变量使用无符号操作。例如,
>
运算符对无符号整数和有符号整数有不同的行为(特别是,它是否应该保留符号位)


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

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

为什么会这样

因为您的程序有一个未定义的行为(使用
%d
,它用于
int
打印一个
未签名的
),所以您可以期待任何事情发生

为什么是无限循环?因为
无符号int
总是
=0

无符号整数的概念是什么

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

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

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

是的,这是在linux上运行的程序#include int main(){unsigned int i;for(i=10;i>=0;i--)printf(“%d”,i);return 0;}。不要对
unsigned
int
的位宽度进行假设。我没有假设,这就是为什么我说“我们将使用16位”例如,c中有符号整数和无符号整数的区别在于它进行位移位的方式,这实际上意味着它是使用sal/sar还是shl/shr指令。否则,寄存器中的数字看起来是相同的。@愚蠢的傻瓜,它还影响比较、乘法(mul/imul)、除法(div/idiv)和向更大类型的传播。也许是别的,不太确定。这个问题没有错,所以不应该以“不是真正的问题”来结束。但是由于非常基本的性质,可能它“太本地化了”。@sixlettervariables哈哈,对不起,我的意思是在109876543210429496729542947294729494729342947292429472947291429496729这样的输出中使用“%u”。。。这是什么意思。我只试着打印10到0个无符号的数字。因为你的打印之间没有分隔符,你实际上看到的是数字-10,9,8,7,6,5,4,3,2,1,0,496729542947294967293。。。第11个数字之后的数字(包括第11个数字)是由于您的退出条件没有被填充(无符号整数总是>=0,因此当您将其从0减少时,它们会滚动-您可以了解到这一点)我认为您的意思是非负的<代码>0U
绝对不是正的。:-)@R的确我将编辑,duh:-)@Virgile在语句
printf(“%d”,u)中没有从
unsigned
int
的转换大于语句
printf(“%d”,f)中从
float
int
的转换。6.3.1.3不适用,7.19.6.1:8说对应于
%d
的参数应该是
int
。对于正常的函数调用,会发生转换,但您是对的,可变函数的行为不同,7.19.6.1§9明确说明这是UB。因此,我删除了原始评论。