有人可以澄清当整数转换为 a 时会发生什么吗short
在C语言中?我正在使用 Raspberry Pi,所以我知道int
是 32 位,因此short
必须是 16 位。
假设我使用以下 C 代码:
int x = 0x1248642;
short sx = (short)x;
int y = sx;
我明白了x
会被截断,但有人能解释一下到底是怎么回事吗?是否采用轮班制?一个数字到底是如何从 32 位截断为 16 位的?
根据 ISO C 标准,当将整数转换为有符号类型时,如果该值超出目标类型的范围,则结果是实现定义的。 (或者可以引发实现定义的信号,但我不知道有任何编译器可以这样做。)
实际上,最常见的行为是丢弃高位。所以假设int
是 32 位并且short
是16位,转换后的值0x1248642
可能会产生如下所示的位模式0x8642
。假设有符号类型的补码表示(几乎所有系统上都使用),高位是符号位,因此结果的数值将是-31166
.
int y = sx;
这还涉及到隐式转换,从short
to int
。由于范围为int
保证至少覆盖整个范围short
,值不变。 (因为在你的例子中,sx
恰好是负面的,这种代表的变化很可能涉及符号扩展,传播1
结果的所有 16 个高阶位的符号位。)
正如我所指出的,语言标准不需要这些细节。如果您确实想将值截断为更窄的类型,那么最好使用无符号类型(具有语言指定的环绕行为)以及显式掩码操作,如下所示:
unsigned int x = 0x1248642;
unsigned short sx = x & 0xFFFF;
如果您想要将一个 32 位数量推入 16 位变量中,那么您应该做的第一件事是决定在该值不适合时您希望代码如何表现。一旦你决定了这一点,你就可以弄清楚如何编写 C 代码来完成你想要的事情。有时截断恰好是您想要的,在这种情况下您的任务将很容易,特别是如果您使用无符号类型。有时,超出范围的值是一个错误,在这种情况下,您需要检查它并决定如何处理错误。有时您可能希望该值饱和而不是截断,因此您需要编写代码来执行此操作。
了解 C 中转换的工作原理很重要,但如果您start有了这个问题,你可能只是从错误的方向来解决你的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)