这个java代码背后的逻辑是什么
我在java代码行下面遇到,对它的输出感到困惑。你能给我解释一下这个代码背后的逻辑吗这个java代码背后的逻辑是什么,java,Java,我在java代码行下面遇到,对它的输出感到困惑。你能给我解释一下这个代码背后的逻辑吗 System.out.println((int)(char)(byte) -1); 输出: 65535 这相当于: byte b = -1; char c = (char) b; // c = '\uFFFF' - overflow from -1 int i = c; // i = 65535 实际上,在原始版本中,显式转换为int只是为了让它调用System.out.println(int),而不是S
System.out.println((int)(char)(byte) -1);
输出:
65535
这相当于:
byte b = -1;
char c = (char) b; // c = '\uFFFF' - overflow from -1
int i = c; // i = 65535
实际上,在原始版本中,显式转换为int
只是为了让它调用System.out.println(int)
,而不是System.out.println(char)
我相信字节
到字符
的转换实际上首先要经过一个隐式的加宽转换-所以它实际上是这样的:
byte b = -1;
int tmp = b; // tmp = -1
char c = (char) tmp; // c = '\uFFFF'
这有帮助吗?嗯,这相当于:
byte b = -1;
char c = (char) b; // c = '\uFFFF' - overflow from -1
int i = c; // i = 65535
实际上,在原始版本中,显式转换为int
只是为了让它调用System.out.println(int)
,而不是System.out.println(char)
我相信字节
到字符
的转换实际上首先要经过一个隐式的加宽转换-所以它实际上是这样的:
byte b = -1;
int tmp = b; // tmp = -1
char c = (char) tmp; // c = '\uFFFF'
这有帮助吗?这和
System.out.println((int)“?”)代码>
(字节)-1
给出:-1
(char)-1
给出:
(int)“?”
给出65535
它与
System.out.println((int)“?”)代码>
(字节)-1
给出:-1
(char)-1
给出:
(int)“?”
给出65535
在java中,byte
是一种有符号(两个补码)的8位原语类型。值为-1的字节的二进制表示形式为11111111
。然后将其转换为一个字符,该字符是一个16位原语,其值介于\u0000
和\uFFFF
(0和65535)之间-看起来字节的位左移了8位,带有符号扩展。因此,在这一点上,二进制表示是:
1111111111111111
…或65535。然而,这并不像说“哦,是的,然后它变成一个int
,所以我们看不到字符表示并被打印出来”那么简单。在java中,所有的数字原语都是有符号的!如果我们将字符转换为另一个16位原语的short
,程序将输出-1
。但是,当我们将其转换为32位int
时。最终的二进制表示形式为:
00000000000000001111111111111111
…签名和未签名的都是65535 在java中,byte
是一种有符号(两个补码)的8位原语类型。值为-1的字节的二进制表示形式为11111111
。然后将其转换为一个字符,该字符是一个16位原语,其值介于\u0000
和\uFFFF
(0和65535)之间-看起来字节的位左移了8位,带有符号扩展。因此,在这一点上,二进制表示是:
1111111111111111
…或65535。然而,这并不像说“哦,是的,然后它变成一个int
,所以我们看不到字符表示并被打印出来”那么简单。在java中,所有的数字原语都是有符号的!如果我们将字符转换为另一个16位原语的short
,程序将输出-1
。但是,当我们将其转换为32位int
时。最终的二进制表示形式为:
00000000000000001111111111111111
…签名和未签名的都是65535 谢谢你,乔恩。我明白这一点。还有一个疑问。如果我把System.out.println((char)(byte)-1);然后它会显示“?”。这是否意味着char
在Java中没有签名?这使得它成为唯一的无符号原语。@Sukumar:这是因为控制台无法识别字符0xFFFF
。@Martijn:是的,您完全正确地认为char
是Java中唯一的无符号原语。@Jon:布尔值有符号吗?:)谢谢你,乔恩。我明白这一点。还有一个疑问。如果我把System.out.println((char)(byte)-1);然后它会显示“?”。这是否意味着char
在Java中没有签名?这使得它成为唯一的无符号原语。@Sukumar:这是因为控制台无法识别字符0xFFFF
。@Martijn:是的,您完全正确地认为char
是Java中唯一的无符号原语。@Jon:布尔值有符号吗?:)在java中,所有数字原语都是有符号的
-否。本练习的重点是显示java中的字符是无符号的。否则结果将是0xFFFFFF而不是0xffff..@Voo Yes,在java中,所有数字原语都是有符号的
,我的意思是除了字符以外的所有原语,字符不代表数字(有点,可能这是一个错误的词语选择…)。我不明白你的回答的第二部分,结果不是0xffff?啊,好吧,我只是习惯于像处理任何其他原语一样不加区别地处理字符(太多C?),但我可以看出这是如何有效的。第二部分的意思是,如果字符不是无符号的,我们将得到0xFFFFFF而不是0xffff。在java中,所有数字原语都是有符号的
-否。本练习的全部目的是显示字符在java中是无符号的。否则结果将是0xFFFFFF而不是0xffff..@Voo Yes,在java中,所有数字原语都是有符号的
,我的意思是除了字符以外的所有原语,字符不代表数字(有点,可能这是一个错误的词语选择…)。我不明白你的回答的第二部分,结果不是0xffff?啊,好吧,我只是习惯于像处理任何其他原语一样不加区别地处理字符(太多C?),但我可以看出这是如何有效的。第二部分的意思是,如果字符不是无符号的,我们将得到0xFFFFFF而不是0xffff。逻辑是混淆和混淆。;)如果你曾经写过这样的代码,那么值得评论一下你为什么这么做。逻辑是混淆和混淆如果你曾经写过这样的代码,那么值得评论一下你为什么这么做。