我的想法:如果声明一个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
似乎不需要手动移位即可。
答案 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
,而0b10000000000000000000000000000000
是INT_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
所以0b101
是5
的二进制文件,~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