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

了解Java无符号数字

方昊阳
2023-03-14
问题内容

我想了解如何将带符号的数字转换为无符号的数字。

可以说我有这个:

byte number = 127; // '1111111'

为了使其无符号,我必须选择“更大”的数据类型“ short”,并应用值为0x00ff的AND运算符。

short number2;  
number2 = number & 0x00ff;

为什么使数字无符号?


问题答案:

Java实际上没有无符号原语。

值127实际上由“ 01111111”表示,第一位是符号(0为正)。

一个无符号字节将能够保存0到255的值,但是127是有符号字节的最大值。由于一个字节有8位,有符号的一个消耗1来保存符号。因此,如果要表示大于127的值,则需要使用具有更大位数的更大类型。较大的类型也有一个符号保留位,但是它至少有8位用于实际值,因此可以表示值255。

话虽如此,您可能应该避免使用byte和short,因为它们存在问题。您会注意到我将结果强制转换为short,因为运算符实际上返回了int。您应该只在int和long中坚持使用Java,因为它们实现得更好。

编辑:由于符号位是short的第一位,所以AND运算符使其无符号,然后将保存字节值的8位复制到short的后8位。因此,如果您有一个负数,则第一个为1的位(这意味着它为负数)实际上成为该值的一部分。短路将始终为正,因为其符号位处于受短路影响的2的幂的2的高位。

 byte:             10101101
                    ||||||| <- actual value
short:     0000000010101101
            ||||||||||||||| <- actual value

编辑2:但是请注意,由于负值使用二进制补码表示,因此该值可能不是您期望的值。所有正值都保持不变。
但是-128 = 0x10000000将变为128
-127 = 0x10000001将变为129
依此类推,直到-1 = 0x11111111将变为255




 类似资料:
  • 代码运行,但无法获得函数、类等的建议。 谢谢

  • 问题内容: 什么是。它与Java编译器的实现细节有关还是JLS中定义的类型有关? 例如, 但是,如果我们这样写: 这就是我能说的。那到底是什么呢? 问题答案: 捕获通配符类型是编译器使用的一种类型,它在一个特定位置代表通配符类型的特定实例的类型。 示例:以具有两个通配符参数的方法为例。声明的类型和被写入完全相同,。但是和可能具有不同且不兼容的运行时类型。 即使以相同的方式编写类型,类型检查器也不能

  • 问题内容: 我在C#中有一个应用程序,它使用RijndaelManaged 加密 部分文件 (因为它们是大文件)。因此,我将文件转换为字节数组并仅对其一部分进行加密。 然后,我想使用Java解密文件。因此,我只需要解密用C#加密 的文件的一部分 (意味着那些字节)。 问题来了。因为在C#中,我们 有无符号字节 ,在Java中,我们有 符号字节 。因此,我的加密和解密无法按照我想要的方式工作。 在C

  • 问题内容: 关于Java支持哪种无符号数据类型,我有些困惑。 我已经读过了,但我不理解它的非常复杂的解释(至少对我而言)。 问题答案: Java仅支持带符号的类型(除外),因为它假定对于初学者来说,一种类型比每种大小都具有两种类型更容易理解。在C语言中,它被认为是错误的根源,因此不包括对无符号类型的支持。 因此设计师选择了四种尺寸 ,8位 ,16位 ,32位 ,64位。 并保持一致性,他们都签署就

  • 问题内容: 我需要使用无符号字节数组。我需要通过网络将某些字符发送到服务器,其中一些字符大于127。 我有下面的代码的简化版本,以尝试理解该概念: 这给出了以下输出: 我需要打印160。由于服务器期望一个160的字节,并且如果它接收到-96,则它不接受该值。我使用int的原因是,当我阅读如何解决该问题时,我经常碰到使用int的建议,但是我不太理解,因为我需要数组为byte类型。 这是我发送数组的代

  • 问题内容: 我正在按照以下链接实施Firebase Messaging,以将消息发送到多个设备 https://firebase.google.com/docs/cloud-messaging/android/send- multiple#build_send_requests 我几乎完成了实现,但停留在最后阶段(构建发送请求) 在下面的代码中 我遇到了错误 也在线 当我按住Ctrl键并单击sen