java - 为什么字节转换返回char的十进制值?
问题描述
我有 Python 背景,我不明白字节转换如何根据 ASCII 返回 char 的十进制值。
以下是一些代码示例:
// C#
string s = "abc123éé";
int[] x = new int[255];
for (int i = 0; i < s.Length; i++){
amount[(byte)s[i] - (byte)'0']++;
}
如果我们寻找第一次迭代,转换是在 'a' char 上,它返回 97。
// Java
char a = 'a';
System.out.println((byte)a);
与 Java 相同,它也返回 97。但在 Python 3 中,它不会作为 char 的十进制值返回。
>>> a = bytes("a", encoding="utf-8")
>>> a
b'a'
现在,如果我们要回答我的问题:
- 如何/为什么字节转换是这样工作的?
- 我知道 byte 的值范围是 -128 到 127,但 char 的值是 0 到 255。即使 'é' 的值是 233,它怎么不给出异常?
- 在这一点上,Python 有什么区别?
解决方案
仅适用于 Java,我不使用 Python:
- 如何/为什么字节转换是这样工作的?
它由 Java 语言规范(主要是JLS-5.1.3 )指定:
“......将 char 缩小到整数类型 T 同样简单地丢弃除 n 个最低位之外的所有位,其中 n 是使用的位数表示类型 T。除了可能丢失有关数值大小的信息外,这可能会导致结果值为负数,即使 chars 表示 16 位无符号整数值......”
(“为什么?” 因为它是这样指定的)
- 我知道 byte 的值范围是 -128 到 127,但 char 的值是 0 到 255。即使 'é' 的值是 233,它怎么不给出异常?
错了,chars 是 0 到 65535 (或'\u0000'
to '\uFFFF'
)JLS-4.2.1
没有异常的原因,它会导致字节值(与或 int-23
相同的位)'é'
233
我必须通过最后一点/问题,我对 Python 的了解不够
推荐阅读
- git - Git 分支合并在 Visual Studio 中无法正常工作
- python - 在 Python 中播放声音,并能够在播放过程中将其切断
- c - 有没有办法用 SO_KEEPALIVE 设置特定的应用程序超时,而不是取决于系统默认超时,即 C 中的 2 小时
- python - 分组还是转置?
- python - 如何在 Pandas 数据框中添加整数表示的列
- c# - 使用实体框架 C# 从数据库表中删除行数据
- javascript - 使用 vue.router 重定向到绝对路径
- android - 如何在 Android TV 中切换音频设备?
- python - (Python) 为列表中的所有对象运行函数
- c++ - bazel rules_foreign_cc cmake_external - 无法找到静态库