【问题标题】:Return type of bitwise operation in CC中按位运算的返回类型
【发布时间】:2013-07-22 08:39:22
【问题描述】:

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

【问题讨论】:

  • & 不是逻辑运算符,而是按位运算符 AND!,如果你想返回 short,只需给出返回类型 short,如果你想 return Val & 0x0000FFFF;,返回类型应该是 int,因为位操作符会自动将结果提升为int
  • 抱歉,我们会更正。
  • 短返回类型就可以了。
  • 如前所述,我的目的是在短变量中保存价值

标签: c type-conversion


【解决方案1】:

假设32-bitint16-bitshort8-bitchar

short temp = Val & 0x0000FFFF;

Val 的类型为 int0x0000FFFF0xFFFF 相同,也是 int 类型。

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

所以:

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

见上文,int

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

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

问题出现了,因为我假设十六进制数本质上被视为无符号整数。

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

【讨论】:

  • 隐式类型转换会注意正确分配符号吗?例如。假设 Val = 0xFFFF ?虽然我可以通过执行来验证这一点 Val 会被视为 -1 还是 32767 ?请帮助理解类型转换。
  • @Bleamer 这里的隐式转换意味着short temp = Val & 0x0000FFFF;short temp = (short) (Val & 0x0000FFFF);是等价的声明。 C 表示如果int 值不能在short 中表示,则从intshort 的转换是实现定义的。在实践中,intshort 位数被视为转换后的值:所以这里short 中的0xFFFF 模式意味着short-1 值(我们假设一个常规的二进制补码签署的代表)。
  • 感谢您的解释。
【解决方案2】:

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

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

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


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

【讨论】:

  • 如果 Val 是无符号整数 (32),您介意评论一下会发生什么行为吗?
  • 如果 Val 是一个无符号整数,那么 Val & 0xFFFF 也是无符号的,但仍然在同一个范围内 [0,65535];行为是相同的。
【解决方案3】:

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

【讨论】:

  • 谢谢,这增加了解决方案,但我相信可以添加更多。
猜你喜欢
  • 1970-01-01
  • 2021-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-03-19
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多