如何在C中使用signed / unsigned创建负二进制数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在C中使用signed / unsigned创建负二进制数?相关的知识,希望对你有一定的参考价值。
我的想法:如果一个人宣布一个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似乎在没有手动移位的情况下有所作为。
如果数字表示为二进制补码,则只需设置符号位即可确保数字为负数。这就是MSB。如果int
是32位,那么0b11111111111111111111111111111111
是-1
,而0b10000000000000000000000000000000
是INT_MIN
。
要调整int(8|16|64)_t
的大小,只需更改位数即可。符号位仍然是MSB。
请记住,根据您的目标,int
可能是2或4个字节。这意味着int a=0b10000101
不足以设置符号位。
如果你的int
是4个字节,你需要0b10000000 0000000 0000000 00000000
(为了清晰起见,添加了空格)。
例如,在32位目标上:
int b = 0b11111111111111111111111111111110;
printf("%d
", b); // prints -2
因为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
它会是相同的,因为它们在二进制形式中是相同的,但事实上你在前面有无符号意味着编译器会以相同的方式存储它,但将它视为正值。
如何在C中使用signed / unsigned创建负二进制数?
简单地否定正值的常数。试图用many 1's
... 1110110
这样做假设int
的位宽。更好的便携性。
#include <stdio.h>
int main(void) {
#define NEGATIVE_BINARY_NUMBER (-0b1010)
printf("%d
", NEGATIVE_BINARY_NUMBER);
}
产量
-10
以上是关于如何在C中使用signed / unsigned创建负二进制数?的主要内容,如果未能解决你的问题,请参考以下文章
C语言 unsigned short 如何相互转 signed char
C语言 请问signed char,unsigned char,short,unsigned sh