【发布时间】:2013-10-16 06:29:08
【问题描述】:
在使用 C 在 short 和 int 之间进行转换时,我感到很困惑。我假设 short 是 16 位,而 int 是 32 位。我用下面的代码进行了测试:
unsigned short a = 0xFFFF;
signed short b = 0xFFFF;
unsigned int u16tou32 = a;
unsigned int s16tou32 = b;
signed int u16tos32 = a;
signed int s16tos32 = b;
printf("%u %u %d %d\n", u16tou32, s16tou32, u16tou32, s16tou32);
我得到的是:
- u16tou32: 65535
- s16tou32: 4294967295
- u16tos32: 65535
- s16tos32:-1
我感到困惑的是 s16 到 u32 以及 u16 到 s32 之间的转换。似乎 s16 到 u32 正在做“符号扩展”,而 u16 到 s32 则没有。这背后的规律究竟是什么?这也依赖于实现吗?在 C 中进行这种类型的转换是否安全,或者我应该自己使用位操作以避免意外结果?
【问题讨论】:
-
您最好也打印
a和b,因为您可能会对它们是什么感到惊讶。 -
您的
printf尝试每次打印前 2 个变量两次,并且从不使用最后 2 个。这是故意的吗?
标签: c