[解決済み】0 < -0x80000000 はなぜ?
疑問点
以下のような簡単なプログラムがあります。
#include <stdio.h>
#define INT32_MIN (-0x80000000)
int main(void)
{
long long bal = 0;
if(bal < INT32_MIN )
{
printf("Failed!!!");
}
else
{
printf("Success!!!");
}
return 0;
}
条件
if(bal < INT32_MIN )
は常に真である。どうしてそんなことが可能なのでしょうか?
マクロを変更すると正常に動作します。
#define INT32_MIN (-2147483648L)
どなたかご指摘ください。
解決方法を教えてください。
これはかなり微妙なところです。
プログラム中のすべての整数リテラルには型があります。どの型を持っているかは、6.4.4.1の表で規定されています。
Suffix Decimal Constant Octal or Hexadecimal Constant
none int int
long int unsigned int
long long int long int
unsigned long int
long long int
unsigned long long int
リテラルな数値がデフォルトの
int
の型は、上の表で示されるように、次に大きな型を試します。つまり、通常の10進整数リテラルの場合、次のようになります。
-
試す
int
-
フィットしない場合は、以下をお試しください。
long
-
サイズが合わない場合は
long long
.
しかし、Hex リテラルの動作は異なります!
のような符号付きの型にリテラルが収まらない場合、そのリテラルは
int
の場合、まず
unsigned int
より大きな型を試す前に 上の表の違いを見てください。
つまり、32ビットシステムでは、リテラルの
0x80000000
は
unsigned int
.
つまり、単項演算子
-
演算子は、符号付き整数をオーバーフローさせるときのように、実装で定義された動作をさせることなくリテラルに作用します。そのかわり、値
0x80000000
は正の値です。
bal < INT32_MIN
は通常の算術変換を行い、その結果、式
0x80000000
から昇格します。
unsigned int
から
long long
. 値
0x80000000
は保存され、0は0x80000000より小さいので、このような結果になりました。
で置き換えると、リテラルは
2147483648L
は10進数表記なので、コンパイラは
unsigned int
の中に収めようとします。
long
. また、Lサフィックスは
long
可能であれば
. 6.4.4.1の表を読み進めると、Lサフィックスにも同様のルールがあります。
long
32ビットの場合はそうではないので、コンパイラは
long long
で、うまく収まる。
関連
-
[解決済み】Valgrind - strcpyのサイズ1の無効な書き込み
-
[解決済み】単項演算子「*」の型が無効(「int」がある)C言語でのエラー
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み】警告:互換性のないポインタ型からの代入
-
[解決済み】式は、単純なポインタ演算を使用して完全なオブジェクト型へのポインタでなければなりません【重複】。
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み】Makefile:1: ***セパレータがありません。停止します。
-
[解決済み】execvp: バッドアドレスエラー
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み】MB/sとMiB/sを計算する方法は?
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み】C++で(-2147483648> 0)がtrueを返す?
-
[解決済み] 最小のint型である-2147483648はなぜ'long'型なのでしょうか?[重複しています]。