【发布时间】: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