我有一个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;
答案 0 :(得分:0)
The C99 language specification表示在执行按位AND时“通常算术转换适用”,val
已经是整数,而十六进制常量也应该是整数(参见第56页),因为它是第一种类型哪个可以代表它。转换和分配都应将int
截断为short
,但在这种情况下您不应丢失任何数据。
答案 1 :(得分:0)
Val & 0x0000FFFF
与Val & 0xFFFF
完全相同;两个表达式都有int
类型,结果严格地在[0,65535]范围内。 (假设提问者声明的是32位int
类型)。
将此结果分配给short
时,如果该值小于SHRT_MAX
,则该值不会改变。如果它大于SHRT_MAX
(在您的平台上可能是32767),则行为是实现定义的[1]。
如果您将结果分配给unsigned short
,这需要能够表示您的表达式可能产生的所有可能值,那么结果将由标准完全指定。
short
所得到的结果,这可能是您所期望的。答案 2 :(得分:0)
我们假设32-bit
int
,16-bit
short
和8-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
。