如何从signed char扩展到signed int



为什么用带符号字符表示的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位。

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

相关内容

  • 没有找到相关文章

最新更新