6

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

#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) を使用すると、同様の動作が得られます。一般に、異なるサイズのオペランドで算術を行うことはお勧めできませんか?

4

4 に答える 4

11

charコンパイラに応じて、署名付きまたは署名なしのいずれかになります。

あなたの場合、署名されているように見え、255 は表現できる範囲外です (おそらく、-128 から 127 までの数値しか表現できません)。

したがって、変数に 255 を代入すると問題が発生します。charこれにより、実装定義の値が得られます。この場合、-1 のように見えます。

-1 に 2 を掛けると -2 になります。そこにミステリーはありません。to へのキャストは何もしません -常に昇格される(int)よりも狭い型、またはそれらで計算が行われる前。intintunsigned int

于 2010-04-16T00:09:21.753 に答える
5

プラットフォームで char が署名されているようです。したがって、char x = 255は実質的に と同じchar x = -1です。int へのキャストは関係ありません。

それを次のように変更してみてください。

unsigned char x = 255;
于 2010-04-16T00:08:23.610 に答える
4

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

プレフィックスを追加することcharで、強制的にすることができます:unsignedunsigned

unsigned char x = 255;
于 2010-04-16T00:08:11.847 に答える
3

他の回答は、あなたの例がどのように「機能する」かをうまく説明しているので、もう一度説明しません。

ただし、使用したいものが「符号なし 8 ビット整数」である場合は、<stdint.h>既にuint8_tを (およびその 16、32、64 ビットの仲間) を使用し、この世界のすべてのchars、shorts、およびs から遠ざけてください。 int.

于 2010-04-16T00:33:20.967 に答える