Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个java代码背后的逻辑是什么_Java - Fatal编程技术网

这个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

我在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)
,而不是
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。逻辑是混淆和混淆。;)如果你曾经写过这样的代码,那么值得评论一下你为什么这么做。逻辑是混淆和混淆如果你曾经写过这样的代码,那么值得评论一下你为什么这么做。