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

时间:2013-01-15 00:25:27

标签: c type-conversion signed

为什么由签名字符表示的255值会转换为带有整数的-1?我看到mov sbl正在使用x86指令将已签名的char转换为签名的int,但为什么它会像现在这样转换?

3 个答案:

答案 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位。

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