繁体   English   中英

从签名char到sign int的符号扩展如何工作?

[英]How does sign extension from signed char to sign int works?

为什么用带符号的char表示的255值会被整数转换为-1 我看到x86正在使用mov sbl指令将带符号的char转换为带符号的int ,但是为什么它以现在的方式转换呢?

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

符号扩展通过检查值的高位并从那里扩展来起作用。 255是全1的无符号,因此当对其进行符号扩展时,将填充1。 所有1的有符号整数格式均为-1。

我注意到您说255为带符号字符。 签名char的最大值实际上是127。

char a = 255;

在某些编译器中,您实际上会得到-1。 无符号字符可以容纳255。

指令movsb{w,l,q}查看字节中的“最高位”,并用该值填充字的其余位(16、32或64位)。

对此的姐妹指令是movzb{w,l,q} ,该零扩展为零(即执行“无符号扩展”)。

在64位x86中,32位操作会自动对高32位进行零填充,因此要将32位值扩展为64位,编译器将添加movslq将32位数字扩展为64位。 。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM