カスタマーサポートセンター

FAQ~よくある質問~ | FAQマスタ詳細表示

FAQ詳細情報

ID 10810817
FAQカテゴリ(大) コンパイラ
最終更新日 2015-08-16

質問内容

if文のかっこの式の一部を変数に置き換えた場合とそのまま記述した場合と結果が異なります

回答内容

計算を intより小さい型の整数で行ったり、型が混在する場合などで、結果が人間の感覚と違う場合がありますので、注意が必要です。

[例]
unsigned short A = 65000, B = 1000, tmp;
 :
tmp = B - A;
if (tmp > 1000) func(); // funcは実行されない   #1
if ((B - A) > 1000) func(); // funcは実行される  #2

[説明]
B - A の計算は、変数AおよびBを int型に拡張後計算されますので、(B - A) = (1000 - 65000) = -64000になります。
(C99 5.1.2.3の2.をご参照ください)

一方、代入文
tmp = B - A;
を実行すると tmpの型が unsigned short であるため、tmpの値は65536-64000=1536になります。

よって、#1の if文の括弧内の式は偽となり、#2は真になります。


その他、整数型の取り扱いで発生する様々な問題について、下記アドレスで紹介しておりますので、ご利用ください。
https://www.iar.com/Support/resources/articles/the-behavior-of-integral-types/

 

 

参考資料URL