0

次のコードが最初にB2を書き込み、次にA1を書き込むのはなぜですか?両方のA1を書くべきではありませんか?C ++の暗黙的なデータ型は、signedintからunsignedint(階層の上位)に変換されます

short a=-5;
unsigned short b=-5u;
if(a==b)
    printf("A1");
else
    printf("B2");
// prints B2

int a2=-5;
unsigned int b2=-5u;
if(a2==b2)
    printf("A1");
else
    printf("B2");
return 0;

// prints A1
4

2 に答える 2

2

負の符号付き積分型をunsigned常にアンダーフローにキャストすると、モジュロ演算が生成されます。unsigned int x = (unsigned int)-1に格納UINT_MAXxます。

unsigned int x = (unsigned int) -1;
std::cout << x << std::endl;
x = (unsigned int) -5;
std::cout << x << std::endl;

出力:

4294967295
4294967291

との両方が非常に高い値に変換されており、その差も4に等しいことに-1注意してください。-5

于 2013-02-17T17:34:52.370 に答える
1

与えられたコードに対して

short a=-5;
unsigned short b=-5u;
if(a==b)
    printf("A1");
else
    printf("B2");

sizeof(short)< sizeof(int)、にaプロモートされたときint-5値が保持され、bプロモートされたときintに2 k -5の値が保持される実装の場合、kはの値表現ビット数ですunsigned short

したがって、同じサイズのビットパターンintであっても、それらは異なるためです。short

于 2013-02-17T17:39:05.860 に答える