为什么字节强制转换会返回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"字符上,它返回97。

// Java
char a = 'a';
System.out.println((byte)a);

和Java一样,它也返回97。但在Python3中,它不会以char的十进制值返回。

>>> a = bytes("a", encoding="utf-8")
>>> a
b'a'

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

  • 字节强制转换是如何/为什么这样工作的
  • 我知道字节的值范围是-128到127,但字符的值是0到255。即使"é"值是233,它怎么不给出一个异常呢
  • Python在这一点上有什么区别

仅针对Java,我不使用Python:

  • 字节强制转换是如何工作的

它是由Java语言规范指定的,主要是JLS-5.1.3:
"。。。将字符缩小为整数类型T同样简单地丢弃除n个最低阶比特之外的所有比特,其中n是用于表示类型T的比特数。除了可能丢失关于数值大小的信息之外,这可能导致结果值为负数,即使字符表示16位无符号整数值">
("为什么?"因为它是如此指定(

  • 我知道字节的值范围是-128到127,但字符的值范围为0到255。即使"é"值是233,它怎么不给出一个异常呢

错误,字符为0到65535(或'u0000''uFFFF'(JLS-4.2.1
没有异常的原因,它将导致字节值-23(与'é'或int 233相同的位(

我必须通过最后一点/问题,我对Python了解不够