8

我有一个 int (32) 值Val包装在表格中

----------------------------------------
| 32-XXXXXXXXX-16 | 15-short-int-val-0 |
----------------------------------------

Val如果我执行操作,则从中提取短整数值时

short temp = Val & 0x0000FFFF;

操作的返回类型是Val & 0x0000FFFF什么?我是否需要键入转换值才能(short)(Val & 0x0000FFFFF)存储正确的数据temp

由于我假设十六进制数本质上被视为无符号整数,因此产生了疑问。

上面的操作和做的有什么区别

short temp = Val & 0xFFFF;
4

3 回答 3

1

让我们假设32-bit int和。16-bit short8-bit char

short temp = Val & 0x0000FFFF;

Val是类型int0x0000FFFF这也与0xFFFFis 类型相同int

然后表达式Val & 0x0000FFFF也是类型,并在对象初始化时int隐式转换为。shorttemp

所以:

Val & 0x0000FFFF 操作的返回类型是什么?

见上文,int

我是否需要将值转换为 (short)(Val & 0x0000FFFFF) 才能将正确的数据存储在 temp 中?

short见上文,否,因为表达式在对象初始化时被隐式转换为temp

由于我假设十六进制数本质上被视为无符号整数,因此产生了疑问。

这是一个错误的假设,因为这里0x0000FFFF是有符号类型int

于 2013-07-23T10:41:15.970 回答
0

C99 语言规范说,在进行按位与时,“应用通常的算术转换”val已经是一个整数,并且十六进制常量也应该是一个整数(参见第 56 页),因为它是第一个可以表示它的类型。强制转换和赋值都应该将 截断int为 a short,但在这种情况下你不应该丢失任何数据。

于 2013-07-23T10:37:00.587 回答
0

Val & 0x0000FFFF完全一样Val & 0xFFFF;两个表达式都有 type int,结果严格在 [0,65535] 范围内。int(假设提问者所说的 32 位类型)。

当您将此结果分配给 ashort时,如果它小于 ,则该值不会改变SHRT_MAX。如果它大于SHRT_MAX(在您的平台上可能是 32767),则行为是实现定义的 [1]。

如果您将结果分配给 a unsigned short,它需要能够表示可能由您的表达式产生的所有值,那么结果将完全由标准指定。


  1. 实际上,在几乎所有现代系统上,结果将只是您将这 16 位解释为 a 所得到的结果short,这可能是您所期望的。
于 2013-07-23T10:38:16.563 回答