質問

今日、私は次のことを見つけました:

#include <stdio.h>

int main(){
char x = 255;
int z = ((int)x)*2;

printf("%d\n", z); //prints -2

return 0;

}

したがって、基本的には、サイズの制限が=記号の右側のオペランドによって決定されるため、オーバーフローを取得していますか?

作業を掛ける前に、なぜINTにキャストしないのですか?

この場合、私はcharとintを使用していますが、「long」と「long long int」(c99)を使用すると、同様の動作が得られます。さまざまなサイズのオペランドで算術を行うことに対して一般的にアドバイスされていますか?

役に立ちましたか?

解決

char コンパイラに応じて、署名または署名なしのいずれかにすることができます。

あなたの場合、それは署名されているように見え、255はそれが表すことができる範囲の外側にあります(おそらく、それは-128から127までの数値のみを表すことができます)。

したがって、問題はあなたがあなたに255を割り当てるときに起こります char 変数 - これにより、実装定義値が表示されます。これは、場合には-1のように見えます。

-1を2枚掛けると、-2が取得されます。そこには謎はありません。キャスト (int) 何もしません - より狭いタイプよりも int 常に昇進します int また unsigned int 計算が行われる前に。

他のヒント

Charはプラットフォームで署名されているようです。だから char x = 255 事実上同じです char x = -1. 。 intへのキャストは関係ありません。

それを変更してみてください:

unsigned char x = 255;

いいえ、2行目でオーバーフローを取得していません(乗算)。問題は、コンパイラが使用していることです signed char デフォルトでは255のオーバーフローと-1を意味します。基本的に、変数を初期化しています x -1の値。 -1からintをキャストすると-1(signed オペランドは、アップキャストでサインを拡張します unsigned オペランドはゼロ拡張されます)。

あなたは強制することができます char することが unsigned を追加して unsigned プレフィックス:

unsigned char x = 255;

他の答えは、あなたの例がどのように「機能するか」をうまく説明しているので、私はそれを二度と説明しません。

ただし、使用したいものが「署名されていない8ビット整数」である場合は、使用するだけであることを観察させてください。 <stdint.h>'s uint8_t すでに(およびその16、32、64ビットの仲間)と charS、 shortintこの世界のs。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top