unsigned short s;
s = 0xffff;
int i = s;
这里的扩展是如何工作的?添加了 2 个更大的顺序字节,但我很困惑是否在那里扩展了 1 或 0。这可能与平台有关,所以让我们关注 Unix 的作用。 int 的两个更大的顺序字节会填充 1 还是 0,为什么?
基本上,计算机是否知道 s
是无符号的,并正确地将 0 分配给 int 的高阶位?所以 i
现在是 0x0000ffff
?或者因为 ints
在 unix 中默认是有符号的,它是否从 s
(a 1) 中获取带符号的位并将其复制到高位字节?
最佳答案
不,unsigned
值永远不会进行符号扩展。向上转型总是用零填充这样的值。
更准确地说,无符号变量表示一个特定的数字,并且在转换后它仍将表示相同的数字,前提是在新格式中是可能的。
无论是否使用十六进制,C(尽管不是 C99)和 C++ 都设计为在没有位的情况下工作,例如使用以 10 为底的数字。
关于c - 有符号和无符号,以及 C 中位扩展的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2706588/