-3

今日、私は次のようなコードがあるサンプル iOS アプリケーションに取り組んでいます。

unsigned int uCount = 0;
int iJoke = -7;
uCount = uCount + iJoke;

しかし、私がそれを次のように印刷したとき:

╔══════════════════╦══════════════════════╦════════════╗
║ Format Specifier ║   Print Statement    ║   Output   ║
╠══════════════════╬══════════════════════╬════════════╣
║ %d               ║ NSLog(@"%d",uCount); ║ -7         ║
║ %u               ║ NSLog(@"%u",uCount); ║ 4294967289 ║
║ %x               ║ NSLog(@"%x",uCount); ║ fffffff9   ║
╚══════════════════╩══════════════════════╩════════════╝

%u の出力は 7 だと思っていました。

それから私は次のように使用しました:

unsigned int i = 0;
int j = -7;
i = i + abs(j);

出力は次のようになります。

╔══════════════════╦══════════════════════╦════════╗
║ Format Specifier ║   Print Statement    ║ Output ║
╠══════════════════╬══════════════════════╬════════╣
║ %d               ║ NSLog(@"%d",uCount); ║      7 ║
║ %u               ║ NSLog(@"%u",uCount); ║      7 ║
║ %x               ║ NSLog(@"%x",uCount); ║      7 ║
╚══════════════════╩══════════════════════╩════════╝

私の問題は で修正されていますが、最初のケースでabs()%u が結果として表示された理由を知りたいです。4294967289

助けてください、よろしくお願いします。

4

3 に答える 3

0

ijoke符号なし整数に昇格されます。ほとんどのコンパイラでは、符号付きビットがワープされて、大きな正の数が得られます。

符号なしオペランドが含まれる場合、変換規則はより複雑になります。

たとえば、int が 16 ビットで、long が 32 ビットであるとします。次に、int である 1U が signed long に昇格されるため、-1L < 1U になります。

あなたは32ビットintを持っているようです:

4294967296 - 7 = 4294967289

一般に、ほとんどの暗黙的な変換は、情報を失うことなく「より狭い」オペランドを「より広い」オペランドに変換するものです。

于 2013-07-18T10:33:27.547 に答える