2

私はこれまでのところこのコードを持っています。2 つの負の整数を足すと、答えは負ではなく正にな​​ります。これを修正するにはどうすればよいですか? 0x80000000 が整数の可能な最小値だと思います

#include <iostream>
#include <string>

using namespace std;

int main(void)
{
unsigned int maxInt = 0x7FFFFFFF;
int num1 = 7;
signed int minInt = 0x80000000;
int num2 = -21;
float num3 = 1;
float i;

cout<<"The value of the first variable is: "<<maxInt<<endl;
cout<<"The value of the second variable is: "<< num1<<endl;
cout<<"Addition of the two numbers: "<< maxInt + num1 <<endl;
cout<<endl;

cout<<"The value of the first variable is: "<<minInt<<endl;
cout<<"The value of the second variable is "<<num2<<endl;
cout<<"Addition of the two numbers: "<< minInt + num2 <<endl;
cout<<endl;

system("pause");
return 0;
}
4

1 に答える 1

8

0x80000000 と -21 を加算すると、結果は 0x7FFFFFDF になります。この 10 進数の数値は 2147483615 です。これは、符号の決定に左端のビットが使用されるために発生します。アンダーフローが発生しています。この場合、最大整数にラップアラウンドし、そこからカウントダウンします。符号なしであるため 0 にラップすることを除いて、2 つの正の整数を追加すると、同じことが別の方法で発生するはずですが、オーバーフローまたはアンダーフロー時の動作は未定義です。

コメントが言うように、より大きなタイプを使用できます。

int64_t result = static_cast<int64_t>(maxInt) + num1;
int64_t result2 = static_cast<int64_t>(minInt) - num2;
于 2012-05-20T04:12:31.380 に答える