時々変数をする必要が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のままです)。