为什么由签名字符表示的255
值会转换为带有整数的-1
?我看到mov sbl
正在使用x86
指令将已签名的char
转换为签名的int
,但为什么它会像现在这样转换?
答案 0 :(得分:6)
假设一个8位字符,类型为signed char
的对象永远不会有255值。当你为这样一个对象分配255时,它会以实现定义的方式转换(实际上,总是减少模数256到范围内)。因此,此时已经的值为-1。将其转换为int
类型根本不会发生任何变化。
答案 1 :(得分:0)
符号扩展通过检查值的高位并从那里扩展来工作。 255是无符号的全1,因此当它的符号扩展时,它的填充为1。有符号整数格式的所有1都是-1。
我注意到你说255是签名字符。签名字符的最大值实际上是127.如果你这样做
char a = 255;
在某些编译器中,你实际上会得到-1。无符号字符可以容纳255。
答案 2 :(得分:0)
指令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位。