我有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了解不够