2

谁能告诉我为什么这种显式转换会产生不同的结果,即使 short/char 的大小都是 16 位?

package jh;

public class Main {

  public static void main(String[] args) {

     byte b = (byte)255;

     System.out.println("Size of short: " + Short.SIZE);
     System.out.println("Size of char: " + Character.SIZE);

     System.out.println((int)((short)b));
     System.out.println((int)((char)b));        
   }
 }

输出:

Size of short: 16
Size of char: 16
-1
65535
4

3 回答 3

4

来自Java 数据类型文档

byte: byte 数据类型是一个 8 位有符号二进制补码整数。它的最小值为-128,最大值为 127(含)。字节数据类型可用于在大型数组中节省内存,其中内存节省实际上很重要。它们也可以用来代替 int ,它们的限制有助于澄清您的代码;变量的范围有限这一事实可以作为一种文档形式。

short: short 数据类型是一个 16 位有符号二进制补码整数。它的最小值为-32,768,最大值为 32,767(含)。与 byte 一样,适用相同的准则:在内存节省实际上很重要的情况下,您可以使用 short 来节省大型数组中的内存。

char: char 数据类型是单个 16 位 Unicode 字符。它的最小值为'\u0000'(或 0),最大值为 '\uffff'(或 65,535,包括在内)

所以简而言之(请原谅双关语),按位它们是相同的。但char表示与 相同的位模式的不同数值short

这也伴随着符号扩展功能:(byte) 255将表示一个字节值,所有位都设置为 ( 0b11111111),即 -1,采用二进制补码。向上转换时,Java 进行了符号扩展操作,所以如果符号位为 0,则所有高位也为 0,但当符号位为 1 时,所有高位也都为 1。现在这意味着 -1 在所有有符号整数数据类型中都意味着 -1(在本例中0b1111111111111111为 for short)。但不是 char - 当所有位都设置时,等于正最大值 - 65535。

于 2013-09-18T10:55:07.357 回答
3

byte已签名并且仅保存值-128..127。当您分配 255 时,它会环绕并变为-1.

(short)b-1

char然而,它是 Java 中唯一的无符号类型,它具有值0..65535,因此(char)-1再次环绕并变为65535.

于 2013-09-18T10:58:25.347 回答
0

byte b = (byte)255;这将值 -1 分配给b因为byte已签名。当你向你施放-1时,short你得到-1。当你向 -1 施放时,char你会得到 65535,因为char谎言的范围在 0 到 65535 之间

于 2013-09-18T10:57:36.737 回答