以下计算结果为"1".
unsigned long iEndFrame = ((4294966336 + 1920 - 1) / 1920) + 1;
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么?我认为unsigned long可以解决这个问题.
非常感谢你的帮助.
sim*_*onc 14
计算右侧的值有类型unsigned int或int.
4294966336 + 1920 = 4294968256
Run Code Online (Sandbox Code Playgroud)
假设sizeof(unsigned int) == 4,这会溢出,留给你960
(960-1)/1920 = 0
Run Code Online (Sandbox Code Playgroud)
(由于整数运算中的舍入).这让你失望
0 + 1 = 1
Run Code Online (Sandbox Code Playgroud)
如果要使用较大的类型(并假设sizeof(unsigned long) > sizeof(unsigned int))执行计算,则需要在计算中进行强制转换
unsigned long iEndFrame = (((unsigned long)4294966336 + 1920 - 1) / 1920) + 1;
Run Code Online (Sandbox Code Playgroud)
或者,如Slava所述,将其中一个文字值设置为unsigned long使用UL后缀的类型
unsigned long iEndFrame = ((4294966336UL + 1920 - 1) / 1920) + 1;
Run Code Online (Sandbox Code Playgroud)