如何在C中使用signed / unsigned创建负二进制数?

问题描述 投票:-1回答:4

我的想法:如果一个人宣布一个int它基本上得到一个unsigned int。因此,如果我需要一个负值,我必须显式创建一个signed 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 doest似乎在没有手动移位的情况下有所作为。

c int
4个回答
2
投票

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

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


2
投票

请记住,根据您的目标,int可能是2或4个字节。这意味着int a=0b10000101不足以设置符号位。

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

例如,在32位目标上:

int b = 0b11111111111111111111111111111110; 
printf("%d\n", b);   // prints -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它会是相同的,因为它们在二进制形式中是相同的,但事实上你在前面有无符号意味着编译器会以相同的方式存储它,但将它视为正值。


1
投票

如何在C中使用signed / unsigned创建负二进制数?

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

#include <stdio.h>

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

产量

-10
© www.soinside.com 2019 - 2024. All rights reserved.