2016-06-24 8 views
2

次のコードでこれを見つけたときに型変換をしています。より大きいデータ型(intなど)をより小さいデータ型(shortなど)に変換すると、Cではどうなりますか?

int i = 123456; 
short s = i; 
printf("%i",s); 

ここで、int値はCコンパイラによって暗黙的にshortに変換されます。この値を表示すると、コンソール出力に-7616が表示されます。私はshortがintのそれよりも小さい範囲を持っていることを理解していますが、C言語が123456から-7616までの値を切り捨てるのではなく直観的なオプションであると知る必要があります。

+0

http://stackoverflow.com/questions/28389750/narrowing-conversion-of-65280-from-int-to-short-int-inside。実装定義 – stackptr

答えて

8

値は切り捨てられていますが、期待通りの値ではありません。

小数点以下の値123456は、16進数の値が0x1E240です。あなたのケースでは16ビットと思われるshortにこの値を割り当てると、それはちょうど下位の16ビットをとります。それは0xE240です。

sunsigned shortの場合、値は57920です。ただし、署名されているため、値はそのように解釈されます。負の数値にはtwo's complement representationが使用されているようですので、0xE240の小数は-7616(= 57920 - 65536)です。

この動作は実装上定義されているため、異なるマシンや異なるコンパイラでこれを行うことはできません。

0

4ビット整数が2ビット整数に変換されたとしましょう。最初のビットは、数値が正の値であるかどうかを決定します。(0)または負の値(1)です。 0111 (dec: 7)11 (dec: -1)に変換されます。より高いビットをカットします。そして最初のビット1-を表すので、それは否定的です。

0

データ型short(2バイトサイズ)の値は[-32768]〜[32767]です。

int main() 
{ 
    int i = 32767; 
    short c = i; 
    printf("%d\n",c); 
    c = i+1; 
    printf("%d\n",c); 
    c = i+2; 
    printf("%d\n",c); 
} 

//Output: 
32767 
-32768 << rolling 
-32767 << rolling 

あなたはshortが許可され、最大値、すなわちより大きな値を割り当てられている場合は、表示された場合の値は

int main() 
{ 
    int i = -32768; 
    short c = i; 
    printf("%d\n",c); 
    c = i-1; 
    printf("%d\n",c); 
    c = i-2; 
    printf("%d\n",c); 
} 

//Output: 
-32768 
32767 << rolling 
32766 << rolling 

[32767]最大値に少なくとも値(-32768)から転がり続ける表示された場合値がshortに許容値より小さい値が割り当てられている場合、値は最大値(32767)から最小値に転がり続けます。

1

下位ビットが保存されるように値が切り捨てられ、しかし、hig彼女のビットは失われます。これは、エンディアンが大きいか小さいかにかかわらず一貫しています。

具体的な例では、123456は11110001001000000としてバイナリで記述されています。 intは4バイトを使用しているので、その番号から省略した1桁の先行ゼロがあることに注意してください。ショーツは2バイトに制限され、直ちに1110001001000000に切り捨てられます。正面に1があり、2の補数ですぐに負の数を示すことに注意してください。 2の補完プロセスを実行すると、結果がどのように得られるかが示されます。

Cでは、intをshortに変換すると、すでに問題が発生しています。勤務先のような場合。wavファイルでは、一連のif文を使用して切り捨てを制御する前に、通常、属性の操作にintデータ型を使用します。

//you will need to #include <limits.h> 

int i = 123456; 
short s; 

if(i > SHRT_MIN && i < SHRT_MAX) //if your int is within the range of shorts 
{ 
    s = i; 
} 


//if your int is too large or too negative, you can control the truncation 

if(i < SHRT_MIN) //if int is too negative 
{ 
    i=SHRT_MIN; 
} 

else //if int is too positive 
{ 
    i=SHRT_MAX; 
} 
関連する問題