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 ;