在溢出的情况下,变量的值总是为负

Sha*_*mar 3 c c++ integer-overflow

它试图解决这个问题,因为N,K amd M,找到最大的整数T这样N*(K^T) <= M.N,K and M可以是值的10^18.这样long long就足够了.我尝试使用T上的迭代来解决它

int T = 0;
long long Kpow = 1;
while(1)
{
  long long prod = N*Kpow;
  if(prod > M)
    break;
  T++;
  Kpow = Kpow*K;
}
Run Code Online (Sandbox Code Playgroud)

但由于N*Kpow可能超出范围long long,因此需要使用一些大整数来处理产品.但我发现了一些巧妙处理这种情况的其他代码

long long prod = N*Kpow;
if(prod < 0)
  break;
Run Code Online (Sandbox Code Playgroud)

即使我总是看到,在溢出时,变量的值变为负值.总是如此,有时甚至在溢出情况下也会出现正值?

Rei*_*ica 8

从语言的角度来看,有符号整数溢出的行为是未定义的.这意味着任何可能发生的事情 - 它可能是负面的,它可以保持不变,程序可以崩溃或者它可以在线订购披萨.

在实践中最有可能发生的事情取决于您运行的处理器体系结构 - 因此您必须参考平台规范才能知道.

但我猜你不能保证溢出是负面的.作为一个人为的例子:

signed char c = 127;
c += 255;
std::cout << (int)c << '\n';
Run Code Online (Sandbox Code Playgroud)

这恰好在x86 上打印126.但同样,它实际上可以做任何事情.

  • 溢出行为也可以随编译器中的优化级别而改变,因为允许编译器假定溢出不会在正确的程序中发生并相应地进行优化. (3认同)