Java int 到 byte 的隐式转换

2023-11-24

我即将开始处理需要读取字节和创建字符串的事情。正在读取的字节表示 UTF-16 字符串。因此,为了测试一下,我想将 UTF-16 编码的简单字节数组转换为字符串。数组中的前 2 个字节必须表示字节顺序,因此必须是 0xff 0xfe 或 0xfe 0xff。所以我尝试按如下方式创建字节数组:

byte[] bytes = new byte[] {0xff, 0xfe, 0x52, 0x00, 0x6F, 0x00};

但我收到了一个错误,因为 0xFF 和 0xFE 太大,无法放入一个字节中(因为字节在 Java 中是有符号的)。更准确地说,错误是 int 无法转换为字节。我知道我可以通过强制转换显式地从 int 转换为 byte 并实现所需的结果,但这不是我的问题所在。

为了尝试一些东西,我创建了一个字符串并调用 getBytes("UTF-16"),然后打印数组中的每个字节。输出有点令人困惑,因为前两个字节是 0xFFFFFFFE 0xFFFFFFFF,后面是 0x00 0x52 0x00 0x6F。 (显然这里的字节顺序与我上面尝试创建的不同,但这并不重要)。

使用此输出,我决定尝试以相同的方式创建我的字节数组:

byte[] bytes = new byte[] {0xffffffff, 0xfffffffe, 0x52, 0x00, 0x6F, 0x00};

奇怪的是它工作得很好。所以我的问题是,为什么Java允许0xFFFFFF80或更大的整数值自动转换为字节而无需显式转换,但任何等于或大于0x80的值都需要显式转换?


这里要记住的关键是int在Java中是有符号的值。当你分配时0xffffffff(这是2^32 -1),这被转换为有符号整型值-1 - an int实际上不能代表像这样大的东西0xffffffff作为一个正数。

因此,对于小于 0x80 和大于 0xFFFFFF80 的值,结果int值在 -128 到 127 之间,可以明确表示为byte。任何超出该范围的内容都不能,并且需要通过显式强制转换来强制,从而在此过程中丢失数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java int 到 byte 的隐式转换 的相关文章

随机推荐

  • delete[] 提供了一个修改后的新指针。未定义的行为?

    我在同行代码评审会议期间看到了如下一些代码 char s new char 3 s a s b s 0 delete s this may or may not crash on some or any day 首先 我知道在标准 C 中
  • 使用 Emacs 在尚未打开的文本文件中递归查找和替换

    作为后续这个问题 它试图找出如何做这样的事情 这应该很容易 这尤其阻止我更习惯使用 Emacs 而是启动我已经熟悉的编辑器 我在编辑多个文件时经常使用这里的示例 在 Ultraedit 中 我会先按 Alt s 然后按 p 显示一个对话框
  • 构建状态管理存储(ngrx/redux)。扁平代表数据,还是嵌套代表视图?

    我正在使用 ngrx 存储来维护应用程序状态 使用 normalizr 来展平来自 API 调用和 Immutable 的数据 到目前为止 它运行得非常好 但我正在处理一些更复杂的数据关系 我想知道如何继续构建商店 为了简化事情 我有两组对
  • Pandas 中的递归 SQL CTE 查询?

    如何优雅地将下面的递归 SQL 查询移植到 Pandas python 代码中 不知何故 如果不编写自己的递归函数 我就看不到一种直接的方法 Python 示例代码 import datetime import numpy as np im
  • Swift 过滤字典错误:无法将“[(_, _)]”类型的值分配给“[_ : _]”类型的值

    我正在尝试快速过滤字典 var data String String data data filter 0 1 Test 上面的过滤器代码在 Swift 2 下编译 但会产生以下错误 无法将 String String 类型的值分配给 St
  • Material Design 不设置警报对话框样式

    我已将 appCompat 材质设计添加到我的应用程序中 但警报对话框似乎没有使用我的主色 primaryDark 或强调色 这是我的基本风格
  • 如何在没有空终止符的情况下初始化 char 数组?

    char 数组是网络消息的一部分 其长度定义明确 因此不需要空终止符 struct Cmd char cmd 4 int arg struct Cmd cmd ABCD 0 this would be buffer overflow 如何初
  • 从公共类中的 AsyncTask 更新 UI 线程

    我试图将一些 AsyncTask 类拆分为公共 单独 函数 这样我就不必重写这么多代码 除了一个非常重要的方面之外 我几乎拥有了它 AsyncTask 函数通过对服务器进行 php 调用来编译 ArrayList 当此列表完成后 我需要更新
  • 使用 mod_remoteip 获取 Apache 2.4 访问日志以显示客户端 IP,而不是使用 Varnish 的 127.0.0.1

    在我的一生中 我无法让 mod remoteip 在我的 Apache 访问日志中获取客户端 IP 我正在使用在 Apache 2 4 7 之前安装的 Varnish 4 进行 Virtualmin 设置 你如何让它发挥作用 我终于在日志中
  • 将 event.target 与现有 jQuery 对象匹配

    我怎样才能做到这一点 event target返回一个 HTML 对象 我的元素是一个 jQuery 对象 除了比较 ID 或类之外 还有更好的方法来确定 event target my jquery object 吗 我想确保它是同一个对
  • 是否保证事件处理程序在调用 AJAX 回调之前完成?

    假设我有一个事件处理程序 它向服务器发出两次 AJAX 调用 foo click function get bar function alert Hello get baz function alert World 我意识到调用回调的顺序是
  • 双三次插值?

    我浏览了互联网 就双三次插值而言 我找不到一个简单的方程 维基百科关于该主题的页面不是很有帮助 那么有没有简单的方法来学习双三次插值的工作原理以及如何实现它 我用它来生成柏林噪声 但使用双线性插值对于我的需求来说是不稳定的 我已经尝试过 如
  • C++ 和表格格式打印

    我正在寻找如何在 C 中打印以便固定表列宽度 目前我已经使用空格和 and 但是一旦数字达到两位数 所有对齐都会变坏 NODE ORDER PARENT 0 0 1 7 7 2 1 0
  • 根据批处理中的 zip 文件重命名提取的文件

    我有多个 zip 文件 其名称例如 001 zip 002 zip 003 zip 并且有可能达到 999 zip 每个 zip 文件只有一个文本文件 我想使用 Batch 提取每个 zip 文件 然后将提取的文本文件重命名为 zip 的文
  • 矩阵组合逻辑

    注意 请阅读所有其他相关问题 这是我第一次和第二次尝试提出这个问题 确定测试矩阵结果的有效方法 笛卡尔积是最好的方法吗 问题是这样的 我有几个 比如 20 个 布尔验证 true false 所有布尔验证作为一个整体也有一个验证结果 我正在
  • PL/SQL 中的并行调用

    我有一个带有 proc 的包 它将执行许多其他过程 如下所示 CREATE PACKAGE BODY pkg IS CREATE PROCEDURE do IS BEGIN other pkg other proc other pkg2 o
  • 将自定义对象从 servlet 传递到 JSP

    我想将 Student 类型的自定义对象从 servlet 传递到 JSP 我创建了一个学生 bean 类 Student 包含 2 个属性firstname 和lastName 学生豆 import java io Serializabl
  • n个字符串的最长公共子串的Java实现

    我需要找到 n 个字符串的最长公共子串并在我的项目中使用结果 java中是否有任何现有的实现 库已经做到了这一点 关于什么并发树 这是一个小型 约 100 KB 库 可用于梅文中心 该算法使用组合Radix and 后缀树 众所周知 它有一
  • 使用按位运算求给定数字的平方根

    是否有一种算法可以使用按位运算求给定数字的平方根 有这段著名的代码魔法计算inverse平方根与一些非常聪明的小玩意 它被错误地归因于约翰 卡马克 这是更深入的挖掘进入它的起源 也许这就是你要问的 但我不建议使用它 在现代 CPU 上 它无
  • Java int 到 byte 的隐式转换

    我即将开始处理需要读取字节和创建字符串的事情 正在读取的字节表示 UTF 16 字符串 因此 为了测试一下 我想将 UTF 16 编码的简单字节数组转换为字符串 数组中的前 2 个字节必须表示字节顺序 因此必须是 0xff 0xfe 或 0