cでcharとintを掛けます
質問
今日、私は次のことを見つけました:
#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ビットの仲間)と char
S、 short
砂 int
この世界のs。