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)
即使我总是看到,在溢出时,变量的值变为负值.总是如此,有时甚至在溢出情况下也会出现正值?
从语言的角度来看,有符号整数溢出的行为是未定义的.这意味着任何可能发生的事情 - 它可能是负面的,它可以保持不变,程序可以崩溃或者它可以在线订购披萨.
在实践中最有可能发生的事情取决于您运行的处理器体系结构 - 因此您必须参考平台规范才能知道.
但我猜你不能保证溢出是负面的.作为一个人为的例子:
signed char c = 127;
c += 255;
std::cout << (int)c << '\n';
Run Code Online (Sandbox Code Playgroud)
这恰好在x86 上打印126.但同样,它实际上可以做任何事情.