2016-04-12 18 views
1
#include <stdio.h> 

int main() 
{ 
    char a = 30; 
    char b = 40; 
    char c = 10; 
    printf ("%d ", char(a*b)); 
    char d = (a * b)/c; 
    printf ("%d ", d); 
    return 0; 
} 

上記コード127 > x > -127 とオーバーフロー値他の場合ならば、通常のINT値をもたらします。オーバーフロー値の計算方法を理解できません。この場合は-80となります。 ありがとうC++チャー算術オーバーフロー

+10

符号付きタイプのオーバーフローは未定義の動作ですので、結果はあなたの家に落ちるクジラを含むどんなものでもかまいません。 –

+1

30 * 40 = 1200そこにあふれていた... – imbearr

+5

@SamKuhmonen奇妙なことに、それが落ちたときにペチュニアのボウルの心を通り抜けた唯一の事は、ああ、もう一度ではありませんでした。 – falstro

答えて

5

ここでは、数字の表現方法を説明します。 2's complementをご覧ください。 30 * 40バイナリでは1200または10010110000ベース2です。しかし、私たちのcharは8ビットしかないので、先頭の100(およびその前にすべての暗黙の0)を切り捨てます。これにより、1011000が残されます。

先頭に注意してください。1の2の補数では、コンピュータが値をどのように格納しているか、負の数を示します。 11111111は-1、11111110は-2などです。もし1011000に下がったら、我々は-80になる。

つまり、1011000を2の補数に変換すると、-80が残ります。

手で2秒補完できます。値を取って先頭の符号ビットを落とし、他の値を入れ替えます。この場合、10110000は2進数で01001111になります。これは79になります。負の値を戻し、ゼロから開始しないためもう1つを削除します。これは-80になります。

+0

私たちは「先頭の100(とその前にすべての暗黙の0)を切り詰めなければならない」ことをどのようにして知っていますか? –

+0

より小さい型で値を表すことができる場合、signed intをより小さい型UBに変換していませんか? – user3528438

+0

@NikhilVerma私たちはそれを知らない。これは実際にここで起こるものですが、何か他のことも起こる可能性があります。それはUBです。 –

1

Charには1バイトしかありません。この場合、1200は0100 1011 0000(バイナリ)です。 1バイトの場合、あなたのケースでは8ビットしか割り当てられません:1011 0000(最初の4ビットは削除されます)。今度は-80(最初のビットは負(1)か正(0)かを示します)。 電卓(プログラマー)を試して、小数点以下1200桁を入力し、QwordからByteに切り替えると、あなたの番号で何が起こるかを見ることができます。

関連する問題