【发布时间】: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的大小如何。