为什么255
用有符号字符表示的值会转换为-1
整数?我看到一条mov sbl
指令被用来x86
将签名转换为char
签名int
,但为什么它会以现在的方式转换?
问问题
1903 次
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 位。
还有movswl
和movswq
将 16 位寄存器分别扩展到 32 位和 64 位。
于 2013-01-15T00:44:24.307 回答