3

为什么255用有符号字符表示的值会转换为-1整数?我看到一条mov sbl指令被用来x86将签名转换为char签名int,但为什么它会以现在的方式转换?

4

3 回答 3

7

假设一个 8 位字符,类型的对象signed char永远不会有值 255。当您将 255 分配给这样的对象时,它会以实现定义的方式进行转换(实际上,它总是以 256 为模归约到范围内)。因此,此时它的值已经是 -1。将其转换为类型int根本不会改变。

于 2013-01-15T00:35:30.237 回答
0

符号扩展通过检查值的高位并从那里扩展来工作。255 是无符号的全 1,因此当它的符号扩展时,它会用 1 填充。有符号整数格式的所有 1 都是 -1。

我注意到你说 255 作为签名字符。有符号字符的最大值实际上是 127。如果你这样做

char a = 255;

在某些编译器中,您实际上会得到 -1。不过,无符号字符可以容纳 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 位。

还有movswlmovswq将 16 位寄存器分别扩展到 32 位和 64 位。

于 2013-01-15T00:44:24.307 回答