Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于C语言中有符号和无符号整数的说明_C - Fatal编程技术网

关于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=

我用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*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*2i
无符号且值
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".
但是as
int
只占用四个字节,4