当前位置: 首页 > 面试题库 >

从2或4个字节转换为有符号/无符号short / int

嵇永望
2023-03-14
问题内容

我必须将字节转换为有符号/无符号int或short。

下面的方法正确吗?哪个是签名的,哪个是未签名的?

字节顺序:LITTLE_ENDIAN

public static int convertTwoBytesToInt1(byte b1, byte b2) {
    return (int) ((b2 << 8) | (b1 & 0xFF));
}

VS。

public static int convertTwoBytesToInt2(byte b1, byte b2) {
    return (int) (( (b2 & 0xFF) << 8) | (b1 & 0xFF));
}

public static int  convertFourBytesToInt1(byte b1, byte b2, byte b3, byte b4){
    return (int) ((b4<<24)+(b3<<16)+(b2<<8)+b1);
}

VS。

public static int  convertFourBytesToInt2(byte b1, byte b2, byte b3, byte b4){
    return (int) (( (b4 & 0xFF) << 24) | ((b3 & 0xFF) << 16) | ((b2 & 0xFF) << 8) | (b1 & 0xFF));
}

对这种转换形式感兴趣。谢谢!


问题答案:

convertXXXToInt1()每对中的第一个方法()是带符号的,第二个(convertXXXToInt2())是无符号的。

但是,Java
int始终是带符号的,因此,如果设置的最高位,b4convertFourBytesToInt2()即使将其视为“无符号”版本,其结果也将为负。

假设byteb2是-1或十六进制的0xFF。所述<<操作者将导致其被“提升”到一个int为-1,或0xFFFFFFFF值类型。移位8位后,将为0xFFFFFF00,移位24个字节后,将为0xFF000000。

但是,如果应用按位运算&符,则高阶位将设置为零。这将丢弃标志信息。这是这两种情况的第一步,将详细介绍。

签:

byte b2 = -1; // 0xFF
int i2 = b2; // 0xFFFFFFFF
int n = i2 << 8; // 0x0xFFFFFF00

未签名:

byte b2 = -1; // 0xFF
int i2 = b2 & 0xFF; // 0x000000FF
int n = i2 << 8; // 0x0000FF00


 类似资料:
  • 问题内容: 在Java中,是否有一种简单而优雅的方法将无符号字节值转换为有符号字节值?例如,如果我所拥有的只是int值240(二进制(24位+ 11110000)= 32bits),如何获得该int的带符号值? 问题答案: 除了,Java没有其他无符号值。考虑以下代码段: 结果将为-1,因为最低的8位已复制到byte变量中。

  • 为什么在C 11中无符号短*无符号短转换为int? int太小,无法处理这行代码显示的最大值。 MinGW 4.9.2溢流 因为(来源) USHRT_MAX=65535 (2^16-1)或更大* INT_MAX=32767 (2^15-1)或更大* 和(2^16-1)*(2^16-1)=~2^32。 这个解决方案会有什么问题吗? 此程序 给出输出 在…上 两者都有 这证明在这些编译器上,被转换为。

  • 我正在与Scribbler2机器人和Fluke2板工作,并通过Java中的Myro与Fluke沟通。Fluke board是Scribbler和用Java编写的桌面客户端之间的蓝牙通信桥梁。它通过一个RS232串口与涂写器通信。 这可能是一个愚蠢的问题,上面的系统很复杂,所以如果我不能很好地解释这一点,请原谅我。 我的问题的背景:Java使用有符号字节。Fluke是(我想)用C写的,所以使用了无符

  • 问题内容: 在C语言中,我可以使用数字做一些技巧: 在Swift中有没有办法做到这一点?请注意,相同的方法无效: 有没有一种方法可以让C的行为在Swift中减法? 谢谢! 问题答案: 所有有符号和无符号整数类型都有一个构造函数,该构造函数从具有相同内存表示形式的有符号(反之亦然)创建无符号数字:

  • 我快速浏览了C 03标准,但仍然无法判断这种行为是否有保证: 结果是: VC在32位窗口中给出<code>0xffffffff。但我的假设是,转换可以通过两种方式进行: 1) 8位有符号字符-1首先直接转换为8位无符号值,该值为二进制11111111或十进制255,然后扩展为32位无符号整数,给出255(0xff)。 2)8位有符号字符-1被有符号扩展到32位有符号int,给出0xffffffff

  • 我在尝试将未签名的 char 数组转换为 jstring 时遇到问题。 上下文是我正在使用来自Java的共享c库。所以我正在实现一个JNI c文件。我在库中使用的函数会恢复 我在 JNI C 文件中实现的函数返回一个 jstring。 所以我需要把无符号的char数组转换成jstring。 但是,尽管数组应该只包含20个字节,但我在Java中随机得到22或23个字节......(虽然 20 个字节