Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果发生溢出,变量值是否始终为负值_C++_C_Integer Overflow - Fatal编程技术网

C++ 如果发生溢出,变量值是否始终为负值

C++ 如果发生溢出,变量值是否始终为负值,c++,c,integer-overflow,C++,C,Integer Overflow,它试图解决这个问题,给定N,K和M,找到最大整数T,这样N*(K^T),就像在任何长度的有符号整数的任何其他情况下一样……当且仅当溢出到符号位中的特定位打开时,溢出使数字为负 这意味着如果你的算术结果会给你一个溢出,如果你将变量单词的长度增加一倍,会使你当前的符号位处于关闭状态,那么你很可能会得到一个错误的结果,这是肯定的。从语言的角度来看,有符号整数溢出的行为是未定义的。这意味着任何事情都有可能发生——可能是负面的,也可能是不变的,程序可能崩溃,也可能是在线订购比萨饼 实践中最有可能发生的情况

它试图解决这个问题,给定
N,K和M
,找到最大整数
T
,这样
N*(K^T),就像在任何长度的有符号整数的任何其他情况下一样……当且仅当溢出到符号位中的特定位打开时,溢出使数字为负


这意味着如果你的算术结果会给你一个溢出,如果你将变量单词的长度增加一倍,会使你当前的符号位处于关闭状态,那么你很可能会得到一个错误的结果,这是肯定的。

从语言的角度来看,有符号整数溢出的行为是未定义的。这意味着任何事情都有可能发生——可能是负面的,也可能是不变的,程序可能崩溃,也可能是在线订购比萨饼

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

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

signed char c = 127;
c += 255;
std::cout << (int)c << '\n';
有符号字符c=127;
c+=255;

std::cout无法将此问题转换为K^t否。在溢出的情况下,变量的值并不总是负值

对于有符号整数,C11dr§3.7.1 3未定义行为“未定义行为的一个示例是整数溢出行为。”因此溢出后没有测试可以跨编译器和平台运行

在潜在溢出发生之前检测它

int T = 0;
long long Kpow = 1;
long long Kpow_Max = LLONG_MAX/K;
long long prod_Max = LLONG_MAX/N;

while(1)
{
  if (Kpow > prod_Max) Handle_Overflow();
  long long prod = N*Kpow;
  if(prod > M)
    break;
  T++;
  if (Kpow > Kpow_Max) Handle_Overflow();
  Kpow = Kpow*K;
}

如果在表达式求值期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义溢出行为也会随着编译器中的优化级别而改变,因为编译器可以假设溢出不会在正确的程序中发生,并进行相应的优化。这是一个问题,而不是一个答案。这是原始帖子中所面临问题的可能解决方案。事实并非如此。有符号整数溢出的行为未定义。有些系统(例如dps)溢出导致最大值。-1“溢出使数字为负数”这是完全错误的!溢出是未定义的行为。它可以做任何事。。。
signed char c = 127;
c += 255;
std::cout << (int)c << '\n';
int T = 0;
long long Kpow = 1;
long long Kpow_Max = LLONG_MAX/K;
long long prod_Max = LLONG_MAX/N;

while(1)
{
  if (Kpow > prod_Max) Handle_Overflow();
  long long prod = N*Kpow;
  if(prod > M)
    break;
  T++;
  if (Kpow > Kpow_Max) Handle_Overflow();
  Kpow = Kpow*K;
}