标签: twos-complement

什么是"2的补充"?

我在计算机系统课程中,并且一直在与Two's Complement一起挣扎.我想了解它,但我读过的所有内容并没有为我提供图片.我已经阅读了维基百科文章和其他各种文章,包括我的教科书.

因此,我想开始这个社区wiki帖子来定义Two's Complement是什么,如何使用它以及它如何在诸如强制转换(从有符号到无符号,反之亦然)等操作中影响数字,逐位操作和位移操作.

我所希望的是一个清晰简洁的定义,程序员很容易理解.

binary computer-science bit-manipulation twos-complement data-representation

410
推荐指数
7
解决办法
40万
查看次数

为什么对签名数字更喜欢两个补码而不是符号和数量?

我只是好奇是否有一个理由为了在二进制中表示-1,使用二进制补码:翻转位并加1?

-1表示为11111111(二进制补码)而不是(对我来说更直观)10000001,它是二进制1,第一位作为负标志.

免责声明:我不依赖二进制算术来完成我的工作!

math binary negative-number internal-representation twos-complement

196
推荐指数
8
解决办法
8万
查看次数

~x + ~y ==〜(x + y)总是假的?

此代码是否总是评估为false?这两个变量都是两个补码签名的整数.

~x + ~y == ~(x + y)
Run Code Online (Sandbox Code Playgroud)

我觉得应该有一些数字满足条件.我试过测试之间的数字-5000,5000但从未达到平等.有没有办法建立一个方程来找到条件的解?

将一个换成另一个导致我的程序中的一个阴险的错误?

c signed bit-manipulation twos-complement

153
推荐指数
9
解决办法
8123
查看次数

如何在Java中内部表示整数?

我试图了解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)

这里的混淆再次是标志说,两者都是负数.可能是我误读/误解了吗?

编辑 …

java memory binary store twos-complement

80
推荐指数
4
解决办法
7万
查看次数

为什么 long long 2147483647 + 1 = -2147483648?

为什么此代码不打印相同的数字?:

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 字节,但为什么这段代码会这样呢?

c c++ integer-overflow undefined-behavior twos-complement

75
推荐指数
3
解决办法
7690
查看次数

为什么在32位机器中 - ( - 2147483648)= - 2147483648?

我认为问题是自我解释的,我想它可能与溢出有关,但我仍然不太明白.引擎盖下发生了什么?

为什么-(-2147483648) = -2147483648(至少在用C编译时)?

c 32-bit twos-complement

62
推荐指数
3
解决办法
1万
查看次数

memset如何将整数数组初始化为-1?

联机帮助页memset:

#include <string.h>
void *memset(void *s, int c, size_t n)
Run Code Online (Sandbox Code Playgroud)

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个字节的值)?

c c++ arrays memset twos-complement

61
推荐指数
2
解决办法
2万
查看次数

Python的两个补充

python中是否有内置函数将二进制字符串(例如'111111111111')转换为二进制补码整数 -1?

python bit-manipulation twos-complement

58
推荐指数
6
解决办法
10万
查看次数

Java中的String.format()和十六进制数字

我试图弄清楚为什么String.format()它的行为方式.

上下文:系统编程类,编写汇编程序.

目标文件中有一个5字符的十六进制字段,我从一个值创建.

尝试使用: String.format("%05X", decInt);

这适用于正数(11 - > 0000B)然而它不适用于负数(-1 - > FFFFFFFF而不是FFFFF)

我想我可以只取最后5个字符的子字符串,但我还是想弄清楚它为什么会这样.

java string formatting hex twos-complement

55
推荐指数
2
解决办法
8万
查看次数

按位不是运算符

为什么按位操作(~0);打印-1?在二进制中,不应该是1.为什么?

javascript c c++ java twos-complement

42
推荐指数
5
解决办法
5万
查看次数