我在计算机系统课程中,并且一直在与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
此代码是否总是评估为false?这两个变量都是两个补码签名的整数.
~x + ~y == ~(x + y)
Run Code Online (Sandbox Code Playgroud)
我觉得应该有一些数字满足条件.我试过测试之间的数字-5000
,5000
但从未达到平等.有没有办法建立一个方程来找到条件的解?
将一个换成另一个导致我的程序中的一个阴险的错误?
我试图了解Java如何在内部存储整数.我知道所有java原始整数都是有符号的(除了短?).这意味着该字节的字节中可用的位数较少.
我的问题是,所有整数(正数和负数)都存储为二进制补码或只是二进制补码中的负数吗?
我看到规格说明了x bit two's complement number
.但我经常感到困惑.
例如:
int x = 15; // Stored as binary as is? 00000000 00000000 00000000 00001111?
int y = -22; // Stored as two complemented value? 11111111 11111111 11111111 11101010
Run Code Online (Sandbox Code Playgroud)
编辑
要清楚, x = 15
In binary as is: `00000000 00000000 00000000 00001111'
Two's complement: `11111111 11111111 11111111 11110001`
Run Code Online (Sandbox Code Playgroud)
因此,如果您的答案是 all
数字存储为两个补码,那么:
int x = 15; // 11111111 11111111 11111111 11110001
int y = -22 // 11111111 11111111 11111111 11101010
Run Code Online (Sandbox Code Playgroud)
这里的混淆再次是标志说,两者都是负数.可能是我误读/误解了吗?
编辑 …
为什么此代码不打印相同的数字?:
long long a, b;
a = 2147483647 + 1;
b = 2147483648;
printf("%lld\n", a);
printf("%lld\n", b);
Run Code Online (Sandbox Code Playgroud)
我知道 int 变量的最大数量是 2147483647,因为 int 变量是 4 字节。但据我所知,long long 变量是 8 字节,但为什么这段代码会这样呢?
我认为问题是自我解释的,我想它可能与溢出有关,但我仍然不太明白.引擎盖下发生了什么?
为什么-(-2147483648) = -2147483648
(至少在用C编译时)?
该联机帮助页说memset
:
Run Code Online (Sandbox Code Playgroud)#include <string.h> void *memset(void *s, int c, size_t n)
的
memset()
功能填充第一n
字节的存储器区域的指向s
与恒定字节c
.
很明显,memset
不能用于初始化int
数组,如下所示:
int a[10];
memset(a, 1, sizeof(a));
Run Code Online (Sandbox Code Playgroud)
它是因为int
由4个字节(比如说)表示,并且一个不能得到数组中整数的所需值a
.
但我经常看到程序员 memset
用来将int
数组元素设置为0
或者-1
.
int a[10];
int b[10];
memset(a, 0, sizeof(a));
memset(b, -1, sizeof(b));
Run Code Online (Sandbox Code Playgroud)
根据我的理解,使用整数初始化0
是可以的,因为0
可以用1个字节表示(在这种情况下可能是我错了).但是,如何可以初始化b
与-1
(一个4个字节的值)?
python中是否有内置函数将二进制字符串(例如'111111111111')转换为二进制补码整数 -1?
我试图弄清楚为什么String.format()
它的行为方式.
上下文:系统编程类,编写汇编程序.
目标文件中有一个5字符的十六进制字段,我从一个值创建.
尝试使用: String.format("%05X", decInt);
这适用于正数(11 - > 0000B
)然而它不适用于负数(-1 - > FFFFFFFF
而不是FFFFF
)
我想我可以只取最后5个字符的子字符串,但我还是想弄清楚它为什么会这样.
为什么按位操作(~0);
打印-1?在二进制中,不应该是1.为什么?