C言語の質問です。
gcc version 4.3.2 (Ubuntu 4.3.2-1ubuntu12)
以下のプログラムをgccでコンパイル・実行すると(1)に入り,"a"が出力されます。unsigned intの計算なのでラップアラウンドが生じtest=4294716272となるのは私の期待どおりです。
ただ、gcc -std=c99でコンパイル・実行すると(2)に入り,"b"が出力されました。c99でコンパイル・実行すると計算結果がなぜ異なっているのかが分かりません。
long test = 0;
unsigned int x = 184;
unsigned int y = 251208;
test = (x-y);
if(test == 4294716272){
printf("a");// (1)
}else if(test == -251024){
printf("b"); // (2)
}
No.1ベストアンサー
- 回答日時:
C90では、longの表現範囲を超える10進整数定数はunsigned long型になります。
したがって、
if(test == 4294716272){
の部分は、testが通常の算術型変換によってunsigned longに変換され、符号無し整数として比較が行われます。
それに対して、C99では、longの表現範囲を超える10進整数定数はlong long型になります。
したがって、上記の箇所では、testはlong long型に変換され、符号付き整数として評価されます。
参考URL:http://www.kijineko.co.jp/tech/creintro/size-of- …
No.4
- 回答日時:
ついでに:
gcc-4.4.3 では,
gcc -o hoge hoge.c
とこのまま C90 でコンパイルすると
this decimal constant is unsigned only in ISO C90
と警告を出してくれます.
No.3
- 回答日時:
C90 と C99 では, 「10進整定数の型」の決め方が異なります.
いずれも「その値を表すことのできる最も小さな型」でますが, C90 では int → long → unsigned long の順に調べるのに対し C99 では int → long → long long の順に調べます.
今の場合 4294716272 は int でも long でも表現できないため, C90 では unsigned long として, C99 では long long として扱います.
従って C90 の環境では test を unsigned long に変換するので (1) に入りますが, C99 の環境では test を long long に変換するので (1) には入りません.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 3×3のラテン方陣をつくるプログラムを作成したのですが、(↓) #include <stdio.h> 5 2023/07/10 01:53
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# プログラミングのペーパーテスト 実行結果を表示せよ #include <stdio.h> int h 1 2022/07/09 15:27
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アプリケーションのDLLファイル...
-
<unistd.h>をVisualStudioでつ...
-
すべてのリビルド: 0 正常、 0 ...
-
コンパイル失敗と表示されまし...
-
ビープ音が鳴りません・・・
-
[COBOL] ソースの復帰
-
c言語です コンパイルした時に...
-
VC++6.0の混在モード
-
ヘッダーファイル『windows.h』...
-
math.hに含まれる関数が使えない
-
Delphiでクラスをオブジェクト...
-
64ビットのlinuxで32ビットメモ...
-
共有ライブラリの内容確認について
-
同じEXE・同じファイルで解析結...
-
C言語で作ったらWindowsでもMac...
-
C90とC99の計算結果の違い?
-
fatal error LNK1112
-
C言語のグローバル変数の初期...
-
HEWの警告のことについて
-
libsshのコンパイルエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
math.hに含まれる関数が使えない
-
実行後にコンパイルに失敗しま...
-
c言語です コンパイルした時に...
-
ビープ音が鳴りません・・・
-
共有ライブラリの内容確認について
-
C言語をコンパイルするとコンピ...
-
すべてのリビルド: 0 正常、 0 ...
-
Verilog_HDLでのdefineとifdef
-
C#で char型とstring型の比較で...
-
64ビットのlinuxで32ビットメモ...
-
gcc コンパイル killed
-
#If True Then の # って何??
-
プレコンパイルの意味を教えて...
-
[COBOL] ソースの復帰
-
<math.h>ヘッダを入力している...
-
C言語で作ったらWindowsでもMac...
-
ヘッダーファイル『windows.h』...
-
define文のパラメータを実行時...
おすすめ情報