255
signed char で表される値が-1
整数に変換されるのはなぜですか? signedをsigned に変換するためにによって使用されているmov sbl
命令が表示されますが、現在のように変換されるのはなぜですか?x86
char
int
3 に答える
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.
符号拡張は、値の上位ビットをチェックしてそこから拡張することで機能します。255 は符号なしですべて 1 であるため、符号拡張されると 1 で埋められます。符号付き整数形式の 1 はすべて -1 です。
あなたが 255 を signed char と言っているのに気付きました。signed char の最大値は実際には 127 です。
char a = 255;
一部のコンパイラでは実際に -1 が返されます。ただし、unsigned char は 255 を保持できます。
命令movsb{w,l,q}
はバイトの「最上位ビット」を調べ、ワードの残りのビット (16、32、または 64 ビット) をその値で埋めます。
これの姉妹命令はmovzb{w,l,q}
で、これはゼロ拡張します (つまり、「符号なし拡張」を行います。
64 ビット x86 では、32 ビット操作は上位 32 ビットを自動的にゼロで埋めるため、32 ビット値を 64 ビットに拡張するために、コンパイラは を追加しmovslq
て 32 ビット数値を 64 ビットに拡張します。
またmovswl
、movswq
16 ビット レジスタをそれぞれ 32 ビットと 64 ビットに拡張することもできます。