如何使用C中的带符号/无符号创建负二进制数?

时间:2019-02-02 03:15:43

标签: c int

我的想法:如果声明一个int,则基本上得到一个unsigned int。因此,如果我需要一个负值,则必须显式创建一个带符号的int。

我尝试过

int a = 0b10000101;
printf("%d", a); // i get 138 ,what i've expected
signed int b = 0b10000101; // here i expect -10, but i also get 138
printf("%d", b); // also tried %u

那么我对二进制有符号整数是否为负值是错误的吗?
如何创建二进制格式的负值?

编辑,即使我使用16/32/64位,我也会得到相同的结果。 unsigned/signed似乎不需要手动移位即可。

4 个答案:

答案 0 :(得分:2)

请记住,int可能是2个字节或4个字节,具体取决于您的目标。这意味着int a=0b10000101几乎没有足够的位来设置符号位。

如果您的int是4个字节,则需要0b10000000 0000000 0000000 00000000(为清楚起见添加了空格)。

例如针对32位目标:

int b = 0b11111111111111111111111111111110; 
printf("%d\n", b);   // prints -2

答案 1 :(得分:2)

如果数字表示为二进制补码,则只需要设置符号位以确保数字为负数即可。那就是MSB。如果int是32位,则0b11111111111111111111111111111111-1,而0b10000000000000000000000000000000INT_MIN

要调整大小int(8|16|64)_t,只需更改位数。符号位仍然是MSB。

答案 2 :(得分:1)

因为int a = 0b10000101只有8位,而您需要16位或32位。请尝试以下操作:

int a = 0b10000000000000000000000000000101

,如果您的计算机是32位,则应该创建负数。如果这不起作用,请尝试:

int a = 0b1000000000000101

还有其他产生负数的方法:

int a = 0b1 << 31 + 0b101

或者如果您使用16位系统

int a = 0b1 << 15 + 0b101

或者这将同时适用于32位或16位

int a = ~0b0 * 0b101

或者这是另一种同时适用于您想要得到-5

的方法
int a = ~0b101 + 1

所以0b1015的二进制文件,~0b101给出了-6,因此要获得-5,您需要添加1

编辑: 由于我现在看到您对带符号和无符号数字感到困惑,因此我将尝试尽可能简单地解释它int

因此,当您拥有:

 int a = 5;

与以下相同:

 signed int a = 5;

,他们两个都是积极的。现在,它与:

 unsigned int a = 5;

因为5是正数。

另一方面,如果您有:

int a = -5;

这与

相同
signed int a = -5;

,但与以下内容不同:

unsigned int a = -5;

第一个2将是-5,第三个不相同。实际上,如果您输入4294967291将会是相同的,因为它们在二进制形式上是相同的,但是您在前面未签名的事实意味着编译器将以相同的方式存储它,但是将其视为正值。

答案 3 :(得分:1)

  

如何在C语言中使用带符号/无符号创建负二进制数?

简单地否定正值的常数。尝试使用many 1's ... 1110110这样做是假设int的位宽。更好地便携。

#include <stdio.h>

int main(void) {
  #define NEGATIVE_BINARY_NUMBER (-0b1010)
  printf("%d\n", NEGATIVE_BINARY_NUMBER);
}

输出

-10