关于C语言中有符号和无符号整数的说明
我用C语言尝试了以下程序,结果是: 输出:当关于C语言中有符号和无符号整数的说明,c,C,我用C语言尝试了以下程序,结果是: 输出:当i为unsigned int时,最后打印0,当i的值为0时,则控件不应进入while循环,因为我给出了i>0条件,但打印了0,我不明白这是怎么可能的 当i被签名int时,则不打印0 请让我知道节目中发生了什么 #include <stdio.h> #include <string.h> main() { unsigned int i=1; int c=1; while(i>0) { i=
i
为unsigned int
时,最后打印0,当i
的值为0时,则控件不应进入while循环,因为我给出了i>0
条件,但打印了0,我不明白这是怎么可能的
当i
被签名int
时,则不打印0
请让我知道节目中发生了什么
#include <stdio.h>
#include <string.h>
main()
{
unsigned int i=1;
int c=1;
while(i>0)
{
i=i*2;
c++;
printf("%d\n",i);
}
printf("%d c value is",c) ;
}
#包括
#包括
main()
{
无符号整数i=1;
int c=1;
而(i>0)
{
i=i*2;
C++;
printf(“%d\n”,i);
}
printf(“%d c值为”,c);
}
您在内部打印了i
,而在计算i=i*2之后因此,当i
无符号且值2^31
时,while
条件为true
,并再次乘以2
,其中由于整数溢出,它变为0
,在检查(i>0)
条件时,打印该值并在下一次循环中结束
对于有符号int
,行为是未定义的,正如@Anonymous所指出的
然而在这里,while
的条件在i
等于2^31
时失败,因为它现在被视为负数(符号位是1
),因此它不会乘以2
,也不会变成0
如果您不想看到0
输出,您可以尝试在i=i*2
语句之前执行printf
。您已经在内部打印了i
,而在计算i=i*2因此,当i
无符号且值2^31
时,while
条件为true
,并再次乘以2
,其中由于整数溢出,它变为0
,在检查(i>0)
条件时,打印该值并在下一次循环中结束
对于有符号int
,行为是未定义的,正如@Anonymous所指出的
然而在这里,while
的条件在i
等于2^31
时失败,因为它现在被视为负数(符号位是1
),因此它不会乘以2
,也不会变成0
如果不想看到0
输出,可以尝试在i=i*2
语句之前执行printf
。更改while
循环,以便首先调用printf
。另外,对无符号整数使用%u
,而不是%d
while(i>0)
{
printf("%u\n",i);
i=i*2;
c++;
}
通过此更改,您将只打印通过while
语句条件的i
的值。更改while
循环,以便首先调用printf
。另外,对无符号整数使用%u
,而不是%d
while(i>0)
{
printf("%u\n",i);
i=i*2;
c++;
}
通过此更改,您将只打印通过while
语句条件的i
的值。使用%d
和无符号int
会导致未定义的行为。要修复您的程序,请将%d
更改为%u
,然后结果将更有意义
当i
达到231(假设您有32位整数)并且您达到了i*2
时,结果是232,实际上是0
,这就是循环结束的原因。无符号整数是这样的(技术定义是算术模UINT\u MAX+1
)
如果i
是有符号的int(并且您使用%d
),那么当i*2
超过int\u MAX
时,您会导致未定义的行为,因此任何事情都可能发生。使用%d
和无符号的int
会导致未定义的行为。要修复您的程序,请将%d
更改为%u
,然后结果将更有意义
当i
达到231(假设您有32位整数)并且您达到了i*2
时,结果是232,实际上是0
,这就是循环结束的原因。无符号整数是这样的(技术定义是算术模UINT\u MAX+1
)
如果i
是带符号的int(并且您使用%d
),那么当i*2
将超过int\u MAX
时,您会导致未定义的行为,因此任何事情都可能发生。在无符号int:
假设int
需要4个字节,则i的值变为“1073741824”
,其二进制表示法为
"01000000 00000000 00000000 00000000"
"10000000 00000000 00000000 00000000".
再将其乘以2,就得到了十进制值“2147483648”
,即二进制表示法
"01000000 00000000 00000000 00000000"
"10000000 00000000 00000000 00000000".
再次将其乘以2得到如下二进制表示法
"00000001 00000000 00000000 00000000 00000000".
但是由于int
只占用四个字节,四个最低有效字节都被填充为零,因此i的值变为零
如果有符号整数:
最高有效位用于指示负值或正值。1表示负数。所以它打印负数,再乘以2。这使得while条件失败。因为负数不大于零。在无符号整数的情况下:
假设int
需要4个字节,则i的值变为“1073741824”
,其二进制表示法为
"01000000 00000000 00000000 00000000"
"10000000 00000000 00000000 00000000".
再将其乘以2,就得到了十进制值“2147483648”
,即二进制表示法
"01000000 00000000 00000000 00000000"
"10000000 00000000 00000000 00000000".
再次将其乘以2得到如下二进制表示法
"00000001 00000000 00000000 00000000 00000000".
但是asint
只占用四个字节,4