为什么用带符号字符表示的255
值转换为带整数的-1
?我看到mov sbl
指令被x86
用于将有符号的char
转换为有符号的int
,但为什么它以现在的方式转换?
假设是8位字符,signed char
类型的对象永远不会有255的值。当您将255赋值给这样的对象时,它将以实现定义的方式进行转换(实际上,总是将256取约简模到范围内)。因此,此时的值已经是-1。将其转换为int
类型没有任何变化。
Sign扩展通过检查值的高位并从那里扩展来工作。255是所有的1都是无符号的,因此当它的符号扩展时,它被1填充。所有有符号整数形式的1都是-1。
我注意到你说255作为有符号字符。有符号char的最大值实际上是127。如果你这样做
char a = 255;
在某些编译器中实际上会得到-1。Unsigned char可以保存255
指令movsb{w,l,q}
查看字节中的"顶位",并用该值填充字的剩余位(16,32或64位)。
的姊妹指令是movzb{w,l,q}
,它是zero扩展的(也就是说,做了一个"无符号扩展")。
在64位的x86中,32位的操作会自动将上面的32位填零,所以要将32位的值扩展到64位,编译器会添加一个movslq
来将32位的值扩展到64位。
还有movswl
和movswq
分别将16位寄存器扩展到32位和64位。