![](/img/trans.png)
[英]Is there a simple way to convert a signed char to an int without sign extension?
[英]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位。 。
还有movswl
和movswq
分别将16位寄存器扩展为32位和64位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.