3

255signed char で表される値が-1整数に変換されるのはなぜですか? signedをsigned に変換するためにによって使用されているmov sbl命令が表示されますが、現在のように変換されるのはなぜですか?x86charint

4

3 に答える 3

7

Assuming an 8-bit char, an object of type signed char can never have a value 255. When you assign 255 to such an object, it gets converted in an implementation-defined manner (which, in reality, is always reduction modulo 256 into the range). Thus, it already has value -1 at this point. Converting that to type int makes no change at all.

于 2013-01-15T00:35:30.237 に答える
0

符号拡張は、値の上位ビットをチェックしてそこから拡張することで機能します。255 は符号なしですべて 1 であるため、符号拡張されると 1 で埋められます。符号付き整数形式の 1 はすべて -1 です。

あなたが 255 を signed char と言っているのに気付きました。signed char の最大値は実際には 127 です。

char a = 255;

一部のコンパイラでは実際に -1 が返されます。ただし、unsigned char は 255 を保持できます。

于 2013-01-15T00:28:43.507 に答える
0

命令movsb{w,l,q}はバイトの「最上位ビット」を調べ、ワードの残りのビット (16、32、または 64 ビット) をその値で埋めます。

これの姉妹命令はmovzb{w,l,q}で、これはゼロ拡張します (つまり、「符号なし拡張」を行います。

64 ビット x86 では、32 ビット操作は上位 32 ビットを自動的にゼロで埋めるため、32 ビット値を 64 ビットに拡張するために、コンパイラは を追加しmovslqて 32 ビット数値を 64 ビットに拡張します。

またmovswlmovswq16 ビット レジスタをそれぞれ 32 ビットと 64 ビットに拡張することもできます。

于 2013-01-15T00:44:24.307 に答える