我在计算机系统课程中,并且一直在与Two's Complement一起挣扎.我想了解它,但我读过的所有内容并没有为我提供图片.我已经阅读了维基百科文章和其他各种文章,包括我的教科书.
因此,我想开始这个社区wiki帖子来定义Two's Complement是什么,如何使用它以及它如何在诸如强制转换(从有符号到无符号,反之亦然)等操作中影响数字,逐位操作和位移操作.
我所希望的是一个清晰简洁的定义,程序员很容易理解.
binary computer-science bit-manipulation twos-complement data-representation
我只是好奇是否有一个理由为了在二进制中表示-1,使用二进制补码:翻转位并加1?
-1表示为11111111(二进制补码)而不是(对我来说更直观)10000001,它是二进制1,第一位作为负标志.
免责声明:我不依赖二进制算术来完成我的工作!
math binary negative-number internal-representation twos-complement
我有以下Java代码:
byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;
Run Code Online (Sandbox Code Playgroud)
打印时结果是254,但我不知道这段代码是如何工作的.如果&运算符只是按位,那么为什么它不会产生一个字节而是一个整数呢?
有没有一种简单而优雅的方法可以将无符号字节值转换为java中的有符号字节值?例如,如果我只有int值240(二进制(24位+ 11110000)= 32位),我怎样才能得到这个int的有符号值?
-46当我们将浮点数转换为int时,此代码会打印出来,
这是因为在从int类型到float类型的转换过程中,信息丢失了。
int i = 1_234_567_890;
float f = i;
System.out.println(i - (int)f); //print -46
System.out.println(i - f); //print 0.0
Run Code Online (Sandbox Code Playgroud)
在使用float和double时如何知道精度损失?
在测试之前分析代码时如何知道结果?
假设我有两个整数,一个是十进制的,另一个是十六进制的:
int myInt01 = 0xc7d23020;
int myInt02 = 3352440864;
Run Code Online (Sandbox Code Playgroud)
两者都是相同的数字,但是当我尝试将十进制整数分配给Java中的变量时,我得到错误:
error: integer number too large: 3352440864
Run Code Online (Sandbox Code Playgroud)
但是当我将十六进制整数分配给Java中的变量时,一切都按预期工作.
为什么会这样?
我不明白int 63823是如何占用更少的空间而不是双1.0.在这个特定的实例中,是否没有更多信息存储在int中?