为什么下面的程序代码向控制台输出值-32?

int num = 0xFFFFFFE;
for(int i=0; i < 4; i++) {
  num = num << 1;
  System.out.println(num);
}

该程序会产生以下结果:

536870908
1073741816
2147483632
-32

我知道,当二进制数字被移到最高(第31位)位置时,值变为负值.

我不知道为什么-32.为什么不是-16或-8,即结果是-32?

如果你能给我解释得更详细些,我会很高兴的.如果你能用图片配上答案,那就太棒了.

我希望我的问题不是愚蠢的.

推荐答案

这并不是真的与比特·斯汀有关.Java使用two's complement表示负数,最后一个移位使num包含

0xFFFFFFE0 // 11111111111111111111111111100000 in binary representation

这是-32,使用2的补码.您可以删除位移位并观察相同的输出:

int num = 0xFFFFFFE0;
System.out.println(num); // -32
System.out.println(Integer.toBinaryString(num));

Java相关问答推荐

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

使用Apache Poi MQLSlideShow,在XSLFTable表中,我们可以在文本段落后面的每个单元格中包含圆角矩形吗?

如果给定层次 struct 级别,如何从其预序穿越构造n元树

CriteriaQuery with max

如何让JFileChooser(DIRECTORIES_ONLY)从FolderName中的空白开始?

使用意向过滤器从另一个应用程序启动服务

在AVL树的Remove方法中使用NoSuchElementException时遇到问题

如何从JNI方法正确调用NSOpenPanel以在正确的线程上运行?

如何在不删除Java中已有内容的情况下覆盖文件内容?

try 使用预准备语句占位符获取信息时出现Try-With-Resources错误

将双倍转换为百分比

在Spring Boot JPA for MySQL中为我的所有类创建Bean时出错?

用于Java的Visual Studio代码完成不起作用

在Java中比较同一多维数组的两个不同的字符串元素

按长度排序字符串数组

为什么Spring要更改Java版本配置以及如何正确设置?

org.springframework.web.HttpRequestMethodNotSupportedException:请求方法';帖子';不支持

使用StringBuilder和append方法创建字符串时Java字符串内部方法的问题

在输入端没有可行的替代方案'; Select *';

java.util.LinkedList()是如何成为MutableList的实例的?