【问题标题】:Mismatch between C and Java bitwise operation on hex valuesC 和 Java 对十六进制值的按位运算不匹配
【发布时间】:2016-06-12 10:15:59
【问题描述】:

我在 C 代码中有以下行,声称将带符号的 int8 转换为无符号的 int16。

float x = (float) (((int16_t) ((temp[0] <<8) & 0xff00) | (temp[1] & 0x00ff)));

我将它转换为 Java 为

float x = (((temp[0] << 8) & 0xff00) | (temp[1] & 0x00ff));

对于同一个输入数组,

temp[] = {0xFC, 0x10}

x= -1008 // In C
x= 64528 // In Java

我在 SO 和 google 上提到了关于这方面的各种帖子,但无法确定缺少什么。

尝试了其他数据类型 short、int、float 等,但无济于事

我们如何在 java 中获得相同的 -1008 值?请帮忙。

提前致谢

【问题讨论】:

  • 如果你的 int 类型只有 16 位,你会调用未定义的行为。作为一个通用规则,避免移动有符号整数。
  • “声称将有符号的 int8 转换为无符号的 int1”。不,它没有。它将两个相邻的字节转换为float,显然但不一定是int8。是否正确,视情况而定。
  • @EJP 谢谢,无论如何我对“声明部分”持怀疑态度
  • 相反,如果temp[0] 为负值,则始终调用UB,无论int 的大小如何。

标签: java c hex


【解决方案1】:

在 C 中,您还有一个额外的演员表:(int16_t)。如果你在 Java 中做同样的事情 - (short),你会得到同样的结果。

问题在于,在 C 和 Java 中,临时结果至少会转换为 int(或可以保存该值的更高类型)。强制转换为 int16_tshort 会强制编译器再次丢失高位。

【讨论】:

  • 非常感谢您提供该问题的详细信息。我当然尝试过投射到short,但事实证明它投射到了错误的位置——括号问题,我的错!
猜你喜欢
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2013-06-23
  • 2013-06-26
  • 2012-06-21
  • 2015-01-14
  • 2023-02-21
  • 1970-01-01
相关资源
最近更新 更多