abs(-2147483648)、-(-2147483648)のように、負の数の絶対値を取る場合は、境界を越えるように注意してください。

時々変数をする必要がn正数値に変換問題解決、及び可変ときn値の範囲が大きく、例えば32ビット符号付き整数[-2 31は、2 31 - 1]は、変換中の境界の外の問題に注意を払う必要があります。

int値の範囲
バイナリ [-2 31、2 31 - 1]
10進数 [-2147483648、2147483647]
16進数 [0x80000000、0x7fffffff]

1.範囲外の現象:
次の関数で、入力パラメーターnがの-2147483648場合、正の数に変換すると範囲外の問題が発生します。

void myFunc(double x, int n) {
    
     // 输出|n|次x
	int abs_n = abs(n); // n为-2147483648时越界,abs_n 仍为-2147483648
	for(int i = 0; i!=abs_n; i++){
    
    
		cout<<x<<end;
	}
} 

上記のコードは、INT_MIN絶対値がまだINT_MIN(0x80000000 補数の負の規則に従って0x80000000である)であるため、無限ループに入ります

2.ソリューション:
2.1。最初に値のタイプを展開し、次に絶対値を取得します。

void myFunc(double x, int n) {
    
     // 输出|n|次x
	long long n_ = n; // n_在 long long范围内,不越界
	方式一:
	n_ = abs(n_); // n_为2147483648
	方式二:
	n_ = -n_; // 直接取负号更好
	for(int i = 0; i!=abs_n; i++){
    
    
		cout<<x<<end;
	}
} 

オーバーフローが発生しないようintに、long long型を型に拡張ます。一部のコンパイラはintおよびlongと同じ長さなので、それらをに拡張する必要がありますlong long
2.2。絶対値関数abs()ソースコード:

int abs(int number)
{
    
    
   return( number>=0 ? number : -number );
}

abs()関数のソースコードから、負の数値の絶対値が負の符号として直接使用されることがわかります。直接使用方法2:n_ = -n_;州内の関数呼び出しプロセス。

3.実験的テスト:
abs関数戻り値(絶対値)は負になる可能性があります。
ここに画像の説明を挿入
参考資料:
1.推奨されるブラウジング:Niuke.com多肢選択問題:math.hのabs戻り値()
2. 頻繁に使用する(絶対値を取る)abs関数は、常に負でない数を返しますか?
3. C標準ライブラリ関数absのエラー

総括する:

1.負の数の絶対値を取得して境界を越える問題に注意するため、最初に値の範囲を拡大してint->long longから、絶対値を取得します。
2.絶対値関数は直接プラス記号であるのでn_ = -n_;、地方の関数呼び出しプロセスとして直接使用されます。
3. INT_MIN絶対値はまだINT_MIN(0x80000000 補数の負の規則に従って0x80000000のままです)。

おすすめ

転載: blog.csdn.net/qq_33726635/article/details/106716035