C++:奇怪的数学结果

tmi*_*hty 3 c++ math

以下计算结果为"1".

unsigned long iEndFrame = ((4294966336 + 1920 - 1) / 1920) + 1;
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么?我认为unsigned long可以解决这个问题.

非常感谢你的帮助.

sim*_*onc 14

计算右侧的值有类型unsigned intint.

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)

  • 为什么不4294966336UL或4294966336ul? (2认同)
  • @ legends2k:这正是我所说的.在C++ 11中,这个代码将产生`2236963`,因为它应该是`long long int`可用于编译器.以上答案仅适用于C90.但是作为一个C++答案,它显然是不正确的,或者更确切地说,对于UB的某些特定表现的内部运作,没有更多的毫无意义的思考. (2认同)