Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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 无符号整数(32位)到无符号长(64位)_C_Unsigned Integer_Unsigned Long Long Int - Fatal编程技术网

C 无符号整数(32位)到无符号长(64位)

C 无符号整数(32位)到无符号长(64位),c,unsigned-integer,unsigned-long-long-int,C,Unsigned Integer,Unsigned Long Long Int,在下面的代码中,我将0xffffffff乘以2得到一个无符号int(32位),并将其存储在无符号long(64位)中。为什么我得不到实际输出,即8589934588。相反,我得到了4294967294。 提前谢谢。 输出: i=4的尺寸 尺寸J=8 2xi=4294967292 /* Code starts here */ #include <stdio.h> #include <stdlib.h> int main (void) { unsigned int

在下面的代码中,我将
0xffffffff
乘以2得到一个
无符号int
(32位),并将其存储在
无符号long
(64位)中。为什么我得不到实际输出,即
8589934588
。相反,我得到了
4294967294
。 提前谢谢。 输出: i=4的尺寸 尺寸J=8 2xi=4294967292

/* Code starts here */
#include <stdio.h>
#include <stdlib.h>

int main (void) 
{
    unsigned int i=4294967294;
    unsigned long long j=i*2;
    printf("Sizeof i=%d\n", sizeof(i));
    printf("Sizeof J=%d\n", sizeof(j));
    printf("2xi=%llu\n", j);

    return 0;
}
/*代码从这里开始*/
#包括
#包括
内部主(空)
{
无符号整数i=4294967294;
无符号长j=i*2;
printf(“Sizeof i=%d\n”,Sizeof(i));
printf(“Sizeof J=%d\n”,Sizeof(J));
printf(“2xi=%llu\n”,j);
返回0;
}

这是因为
i*2
是整数乘法。即使将其存储在
long
中,您仍在进行整数运算,这会导致溢出

下面的代码可以工作,因为我们将其升级为
long
multiply

#include <stdio.h>
#include <stdlib.h>
int main (void)
{
  unsigned int i=4294967294;
  unsigned long long j=((unsigned long long)i)*2;
  printf("Sizeof i=%d\n", sizeof(i));
  printf("Sizeof J=%d\n", sizeof(j));
  printf("2xi=%llu\n", j);

  return 0;
}

i*2
不知道它被分配给
unsigned long
——因为
i
是一个
unsigned int
2
是一个
int
类型,乘法是使用
unsigned int
类型执行的,这会产生您得到的结果

您可以通过将
2
设置为
无符号长
文字来解决此问题,该文字将乘法的
i
提升为
无符号长
,或者在乘法之前将
i
强制转换为
无符号长
,其效果相同:

unsigned long long j=i*2ULL;
/* or */
unsigned long long j=((unsigned long long)i)*2;


总的来说,请记住:在C语言中,赋值/初始化的目标并不影响其右边表达式的计算方式-所涉及的类型仅由操作数的类型决定。

因为
i
是一个
无符号int
2
是一个
int
并将被提升为
无符号int
手术就要结束了。一种解决方案是将
i
转换为
无符号长型

unsigned long long j = ((unsigned long long)i)*2 ;
中的相关章节位于
6.2.5/9

涉及无符号操作数的计算永远不会溢出, 因为无法由结果无符号整数类型表示的结果是 约化模:比可计算的最大值大一的数 由结果类型表示


请记住,
有符号溢出
是未定义的行为,但无符号溢出只是包装。
unsigned long long j = ((unsigned long long)i)*2 ;