c - 有符号和无符号,以及 C 中位扩展的工作原理

标签 c types

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/

相关文章:

arrays - 循环中的数组修改

php - 在 PHP 中指定类的对象类型的方法

c# - 十六进制表示法和有符号整数

c# - 避免在 Type.GetType() 中给出命名空间名称

c - strcpy(char*,char a[]) 给出了错误的输出。 (逐字反转字符串)

c - 从文件 fgetc 读取的性能与 fread 整个字符串的性能

c - 以下片段的输出是什么?

java - 为什么在实例化期间不能在顶层使用通配符,但在实例化期间可以在其他所有级别使用通配符?

c - 使用 ZMQ 获取 freeswitch 事件

c - 一个简单算法的时间复杂度