【剑指offer知识点】Java中无符号整型、如何与int/long类型互相转化

简介: 【剑指offer知识点】Java中无符号整型、如何与int/long类型互相转化

[1] 结论


  Java中没有无符号数据类型(它就是这样设计的,我没查到为什么),byteshortintlong都是有符号数据类型。当我们逻辑上说一个数是无符号类型的话,往往代表我们说它的二进制符号位应该是要纳入计算的,而Java中把这个不该纳入计算的位置当成符号位,所以和我们现象中的数据不一致。特别注意:在Java中,负数以补码存储。

  解决办法就是提升类型,把符号位包裹在可计算位中:

int  toUnsignedInt(byte x)
long  toUnsignedLong(byte x)

[2] 举例说明无符号和有符号的区别


baf94ca6666549e1976cb85584942fdb.png

  如上图,8位负数-42的原码、反码、补码如图所示。假设我们在逻辑上认为Java中的byte类型的-42是一个无符号类型数字,那么它的实际数字应该是214,即它的补码的机器码大小。

  在Java中,由于负数以补码方式存储,所以负数提升为无符号数字时,是把它的补码的符号位纳入计算,而不是原码或者反码。

[3] 口算出无符号数


  如果想直接口算,可以使用:

负数时: 无符号数 = 2^n + 负数
正数时: 无符号数 = 正数

  8位负数-42的无符号数 = 2^8 + (-42) = 214。

相关文章
|
2月前
|
存储 Java 开发者
Java 中 Set 类型的使用方法
【10月更文挑战第30天】Java中的`Set`类型提供了丰富的操作方法来处理不重复的元素集合,开发者可以根据具体的需求选择合适的`Set`实现类,并灵活运用各种方法来实现对集合的操作和处理。
|
2月前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
90 2
|
2月前
|
存储 Java 编译器
Java泛型类型擦除以及类型擦除带来的问题
泛型擦除是指Java编译器在编译期间会移除所有泛型信息,使所有泛型类型在运行时都变为原始类型。例如,`List<String>` 和 `List<Integer>` 在JVM中都视为 `List`。因此,通过 `getClass()` 比较两个不同泛型类型的 `ArrayList` 实例会返回 `true`。此外,通过反射调用 `add` 方法可以向 `ArrayList<Integer>` 中添加字符串,进一步证明了泛型信息在运行时被擦除。
54 2
|
2月前
|
存储 算法 Java
Java零基础-charAt(int index)详解
【10月更文挑战第20天】Java零基础教学篇,手把手实践教学!
69 4
|
2月前
|
存储 算法 Java
Java零基础-charAt(int index)详解
【10月更文挑战第16天】Java零基础教学篇,手把手实践教学!
26 1
|
3月前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
72 3
|
3月前
|
Java
Java 中锁的主要类型
【10月更文挑战第10天】
|
8天前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
48 17
|
19天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者