从有符号字符到有符号整型的符号扩展是如何工作的?

3

为什么一个有符号char表示的255值,在转换为整数时会变成-1?我看到x86使用mov sbl指令将有符号char转换为有符号int,但为什么它现在以这种方式进行转换呢?


3
如果您想获得答案,请展示您的示例代码。 - OldProgrammer
你是指无符号字符吗?有符号字符只能到达128。有符号字符中的255实际上是-1。 - Jesus Ramos
1
你确定你的平台的 signed char 确实可以表示值为 255 吗? - Kerrek SB
3个回答

7
假设一个字符是8位,类型为 signed char 的对象不能取值255。当你将255分配给这样的对象时,它会以实现定义的方式转换(实际上,总是在模256减少到范围内)。因此,在这一点上它已经有了值-1。将其转换为 int 类型不会产生任何变化。

1
“object”这个词是有意使用的;它与“变量”的意思不同,并且是C标准语言中我所指向的正确词汇。请不要进行看似微不足道的编辑,以免将答案的意思改变为不同或不那么精确的内容。 - R.. GitHub STOP HELPING ICE

0

符号扩展的工作原理是检查值的高位并从那里进行扩展。255作为无符号数时,所有位都是1,因此在进行符号扩展时会用1进行填充。在有符号整数格式中,所有位都是1表示-1。

我注意到你说255是有符号字符。有符号字符的最大值实际上是127。如果你这样做

char a = 255;

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


@CarlNorum 谢谢你的手指有点肥 :P - Jesus Ramos

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接