2012-03-04 5 views
6

データ型プロモーション、次のコードでは

#include "stdio.h" 
signed char a= 0x80; 
unsigned char b= 0x01; 


void main (void) 
{ 
    if(b*a>1) 
     printf("promoted\n"); 
    else if (b*a<1) 
     printf("why doesnt promotion work?"); 

    while(1); 
} 

私は「「昇格予想を印刷するしかし、私が署名し、unsigned int型のデータ型、およびとして持つことができるなら、それはなぜ doesntの。?。予想通り正の数、0x01のように、例えば、0x80000000のaとb負の数は、「昇格」に印刷されます。

PLZは、私は問題が何であるかを理解するのに役立つ!

答えて

10

あなたは厄介でキャッチされてきましたCのタイプ促進ルール

Cにおいて

intより小さい整数型の中間体は、intに自動的に昇格されます。

だからあなたがいる:

0x80 * 0x01 = -128 * 1 

0x80intを入力するように拡張署名される:

0xffffff80 * 0x00000001 = -128 * 1 = -128 

だから、結果は-128であり、したがって1未満です。


あなたがタイプintunsigned intを使用する場合は、両方のオペランドがunsigned intに昇進。符号なし整数として0x80000000 * 0x01 = 0x800000001より大きい。


だからここは場所を取っているタイプのプロモーションのサイドバイサイドの比較です:b*aは常に== -128あるので

(signed char) * (unsigned char) -> int 
(signed int) * (unsigned int) -> unsigned int 

(signed char)0x80  * (unsigned char)0x01 -> (int)   0xffffff80 
(signed int)0x80000000 * (unsigned int)0x01 -> (unsigned int)0x80000000 

(int)   0xffffff80 is negative -> prints "why doesnt promotion work?" 
(unsigned int)0x80000000 is positive -> prints "promoted" 

Here's a reference to the type-promotion rules of C.

+0

@ミステリ​​ー私はあなたの答えを理解していません。たとえそれがsigned int型に拡張されたとしても、それはそうだとは思えませんが、それを仮定すると、なぜunsigned intに昇格され、製品は+ ve番号になりますか? – Dom045

+0

+1 - この回答は長いマイルで私よりもはるかに優れています(私はそれを削除しました) –

+0

@ Dom045この仕様はそうだと言っています。 'signed char'と' unsigned char'は 'int'よりも低い型です。したがって、彼らは両方ともintに昇格されます。 'signed int'と' unsigned int'の場合、標準では両方が 'unsigned int'に変換されることが規定されています。ルールはここで見つけることができます:https://www.securecoding.cert.org/confluence/display/seccode/INT02-C.+Understand+integer+conversion+rules – Mysticial

2

printf("promoted\n");は決して を実行していない理由は、これは、1

a  b  
0x80 * 0x01 = -128 * 1 
未満です
関連する問題