【问题标题】:Casting an int to byte in Java在 Java 中将 int 转换为 byte
【发布时间】:2014-09-10 09:50:27
【问题描述】:

请不要将其标记为重复。这是完全不同的问题?我已经完成了关于这个域的一系列问题,之前在这个网站上提出过。

我引用 Herbert Schildt 的话:铸造不兼容的类型 - 如果整数的值大于一个字节的范围,它将被减少模(整数除以的余数)字节范围(-128 到 127)。

现在考虑一下: 字节 b = (字节) 246;

    System.out.println("---"+246%256); //this gives 246
    System.out.println("---value of b after casting an int to byte---" + b);// this gives -10

Java 中的字节是有符号的,因此它的范围是 -2^7 到 2^7-1 - 即 -128 到 127。由于 246 高于 127,因此我们最终折回为 256-246=10。也就是说,本质上是加减 256 (2^8) 直到它落入范围内。

赫伯特的答案是什么?我认为它应该是 256 - (246%256) = 10。(因为 246 又超出了字节的范围。)但是我怎么知道它是 246-256 还是 256-246。我知道它可以通过实现 2 的补码来计算。我需要在不使用 2 的补码的情况下知道它。(只需添加或减去 246-256 或 256-246。)

【问题讨论】:

  • 始终是 246-256,而不是 256-246。
  • 这背后有什么逻辑吗?
  • 256-246 不是“减去 256” - 它是减去 246(从 256)。
  • 知道了。我的一生都是谎言。

标签: java


【解决方案1】:

当您将 int 转换为 byte 时。 Java 将 int 的最后 8 位保存到 byte 并抛出其他的。

byte b = (byte) (246+1024);  // -10

当您需要将其打印为未签名时,请使用 Byte.totoUnsignedInt()

byte b = (byte) 246;
int i = Byte.toUnsignedInt(b);
System.out.println(i);

【讨论】:

    猜你喜欢
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2020-02-03
    • 2011-08-19
    相关资源
    最近更新 更多