0
点赞
收藏
分享

微信扫一扫

补码与位运算

金刚豆 2022-04-25 阅读 55
c++

补码

众所周知,在计算机中所以的东西都是使用2进制来表达的,数据类型只不过是我们看待它(二进制)的一种方式。
补码是计算机用来解决表达负数的一种形式。
比如:11111111(一个字节八个比特)+ 00000001 = 00000000
这个就好比我们十进制中的 -1+1 = 0
补码的意义就是拿补码和原码可以加出一个溢出的“零”。
对于-a,其补码就是0-a, 实际是2^n-a, 而n是这这种类型的位数,比如char(1字节8比特).

对于一个字节(8位),可以表达的是:
00000000 - 11111111
其中
00000000——> 0
111111111 到 10000000 -> -1 ~ -128
00000001 到 01111111 -> 1 ~ 127

其中数据类型的范围为2(n-1) 到 2n-1 -1
为什么呢?
因为中间有个0需要存放所以在正部给一个位置去存放0

下面展示一些 内联代码片

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	char c = 255;
	int i = 255;
	printf("c=%d\ni=%d\n", c, i);
	return 0;
}

当你演示这个段代码的时候,你就会发现c和i输出的值分别是-1和255,为什么呢
因为在char里头255就是二进制的11111111,
而在int里头是00000000 00000000 00000000 11111111

unsigned 类型 变量名字
意义就是不以补码的方式来展示,就是牺牲负数部分,来使得整数部分的表达更多
其实unsigned的初衷不是为了去扩展数能表达的范围,而是为了做纯二进制的运算,主要是为了移位。

举报

相关推荐

0 条评论