2010-11-28 5 views
0

ボーランドはunsigned intにどのように短くキャストしますか?私はキャスト1で57000を取得していけないのはなぜボーランドC/C++の符号なし整数へのキャストショート

sNum = -8536 
usNum = 57000 
uiNum = 4294958760 
uiNum = 57000 

:unsigned int型に短い(unsigned short型への暗黙のキャストはunsigned int型へのキャストの前には存在しない?)

#include <stdio.h> 

void main() { 
    short sNum = 57000; 
    unsigned short usNum = sNum; 
    unsigned int uiNum; 

    printf("\r\nsNum = %d", sNum); 
    printf("\r\nusNum = %u", usNum); 

    //cast 1: short -> unsigned int 
    uiNum = sNum; 
    printf("\r\nuiNum = %u", uiNum); 

    //cast 2: unsigned short -> unsigned int 
    uiNum = (unsigned short)sNum; 
    printf("\r\nuiNum = %u", uiNum); 
} 

は私に出力を与えますか?

答えて

0

あなた

printf("\r\nsNum = %d", sNum); 

ラインとの符号付き整数を印刷するように求められますので。変数はintに符号拡張され、intとしてprintf関数に渡され、そのパラメータをintとして解釈しました。

あなたは

printf("\r\nsNum = %u", sNum); 

をした場合あなたが短いの範囲外のSNUMに値を入れている57000

+0

OK]をクリックして、引数のthatsが、問題は、あなたが他の署名の変数で変数を使用する場合、-8536の値が使用されています。 – harry

+0

いいえ、2番目のケースでは、間違った型を 'printf'に渡すための未定義の動作が得られます。 (技術的には、表現が同じである必要があるので、値が正の場合は 'unsigned'の代わりに' int'を渡すことができると信じますが、ここでは 'int'を渡します(' sNum ')は負です。)' int'と 'short'が同じサイズでなければ57000を印刷することはできません。 –

0

あなたが得るでしょう。 intに変換されてから符号なしのintに変換される整数-8536は、4294958760です。

sNumを符号なしのshortとして宣言するか(必要な値を格納できるようにするか)、またはunsigned intではなくintに変換します。

+0

はい、私は値がショート鳴っているのousideであることを知っています。しかし、私は、フォールリングキャストがあると思った:短い - >符号なし短い - >符号なし長い... – harry

1

いいえ、unsigned intへのキャストの前にunsigned shortへの暗黙のキャストはありません。なぜそこにあるのだろうか?

まず、この実装で短絡が16ビットの場合、57000は適合しないため、短いsNumに57000を格納することはできません。それはオーバーフローし、-8536を生み出します。

キャスト2では、最初にshort(-8536)からunsigned short(57000、-8536と同じビットパターンですが、符号なし数値として解釈されるため)から(明示的キャストを使用して)変換してから符号なしshortからunsigned intへ(57000)。

キャスト1では、short(-8536)からunsigned intに直接変換します。

3

あなたのコードで唯一のキャストがあります:

uiNum = (unsigned short)sNum; 

あなたはキャストを呼んでいるものの残りの部分は、C言語で(暗黙的)な変換と呼ばれています。コンバージョンに隠された中間ステップはありません。中間型を使用する場合は、その型の変数にキャストまたは代入を使用して強制することができます。

第二に、ライン:

short sNum = 57000; 

は実装定義の振る舞いがあります。値を(暗黙的にまたはキャストを介して)値を適合しない符号付きの型に変換するコードは避けるべきです。

最後に、「C/C++」についてこのような質問をするべきではありません。そのような言語はなく、型システム(単純整数型の場合でも)は2つの言語では十分に異なり、多くの質問は実際に使用している言語に応じて異なる回答をします。

0

短いはunsigned int型とショートの両方として明示的に言及しない限り

intは8×4 = 32ビット

を有する8×2 = 16ビットが署名されています。 符号付き数値の場合、左端のビットは符号ビットを保持します。

したがって、符号付きshortでは、16 - 1 = 15ビットが残っています。したがって、shortの上限は2^15 32768でなければなりません。 これより大きな任意の数の場合は、2^16(符号なしまたは合計容量の上限65536)から減算され、負の符号付きで格納されます[これはもの賛辞】ここで

65536から57000 = -8536したがって結果

関連する問題