返回C中的按位运算类型

时间:2013-07-23 10:21:24

标签: c type-conversion

我有一个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;

3 个答案:

答案 0 :(得分:0)

The C99 language specification表示在执行按位AND时“通常算术转换适用”,val已经是整数,而十六进制常量也应该是整数(参见第56页),因为它是第一种类型哪个可以代表它。转换和分配都应将int截断为short,但在这种情况下您不应丢失任何数据。

答案 1 :(得分:0)

Val & 0x0000FFFFVal & 0xFFFF完全相同;两个表达式都有int类型,结果严格地在[0,65535]范围内。 (假设提问者声明的是32位int类型)。

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

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


  1. 在实践中,在几乎所有现代系统中,结果将是您将这16位解释为short所得到的结果,这可能是您所期望的。

答案 2 :(得分:0)

我们假设32-bit int16-bit short8-bit char

short temp = Val & 0x0000FFFF;

Val的类型为int。与0x0000FFFF相同的0xFFFF也属于int类型。

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

所以:

  

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

见上文int

  

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

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

  

由于我假设十六进制数字本身被视为无符号整数,因此出现了疑问。

这是一个错误的假设,因为此处0x0000FFFF具有签名类型int