为什么一个有符号char表示的255值,在转换为整数时会变成-1?我看到x86使用mov sbl指令将有符号char转换为有符号int,但为什么它现在以这种方式进行转换呢?
为什么一个有符号char表示的255值,在转换为整数时会变成-1?我看到x86使用mov sbl指令将有符号char转换为有符号int,但为什么它现在以这种方式进行转换呢?
signed char
的对象不能取值255。当你将255分配给这样的对象时,它会以实现定义的方式转换(实际上,总是在模256减少到范围内)。因此,在这一点上它已经有了值-1。将其转换为 int
类型不会产生任何变化。符号扩展的工作原理是检查值的高位并从那里进行扩展。255作为无符号数时,所有位都是1,因此在进行符号扩展时会用1进行填充。在有符号整数格式中,所有位都是1表示-1。
我注意到你说255是有符号字符。有符号字符的最大值实际上是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位。
signed char
确实可以表示值为 255 吗? - Kerrek SB