2017-01-11 11 views
-5

ここに私のコードと出力のスニペットがあります。大きな正の数を掛けたときに、否定的な結果をもたらす理由を示唆していますか?大きな正の数を掛けるとき、結果はなぜ負であるのですか?

int printM(int v) 
{ 
    int g=v+5; 
    g=g*3344564*452346; 
    printf("The value of g is %d\n",g); 
    return g; 
} 
int main() 
{ 
    int f=0; 
    int a=45; 
    a=a+334; 
    a=a+534534; 
    a=a+939; 
    a=a+45345654645; 
    f=printM(a); 
    return 0; 
} 

出力:あなたはintをオーバーフローするときに終わる何

[email protected]:~/Desktop/c_d$ gcc -g linked_list.c 
[email protected]:~/Desktop/c_d$ ./a.out 
The value of g is -377042000 

`

+2

'signed int'の範囲は何ですか?.... – LPs

+1

整数オーバーフロー(符号付き整数では未定義の動作です)。良い本を掴んで、それを読んで勉強を始めるかもしれません。 SOのどこかには良い本のリストがあります。 –

+0

たとえ私が署名したとしても、結果は同じ –

答えて

1

未定義の動作です。 INT_MAXは、プラットフォーム上でintが表すことができる最大値として定義されています。

unsignedのオーバーフローがよく定義されています。これはモジュロUINT_MAX + 1をラップアラウンドします。

(何が価値があるのは、あなたのケースで起こっおそらくintは、メモリがunsignedとして解釈されている場合、それはどうなると全く同じように周りにラップされていることであるため)。

+0

"それは2Nモジュロをラップします(Nは符号なしタイプのビット数です)。 - ではない正確に。パディングビットがある可能性があります。それはモジュロ 'UINT_MAX + 1'をラップすると言う方がいいでしょう – Olaf

+0

@Olaf:もちろん、非常に真実です。 – Bathsheba

関連する問題