首页 > 解决方案 > 为什么字节转换返回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'

现在,如果我们要回答我的问题:

标签: javapython

解决方案


仅适用于 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 的了解不够


推荐阅读