C++_int负数转unsigned

有符号数和无符号数

      • 有符号数
      • 无符号数
      • 负整数转化为无符号数
      • 编程测试

有符号数

有符号数中有一个符号位,正数为0,负数为1.
例如
int a=3;
因为c++中的int占32位
3的二进制数表示为
0000 0000 0000 0000 0000 0000 0000 0011
-3的二进制数表示为
1000 0000 0000 0000 0000 0000 0000 0011

无符号数

不存在符号位
举例
int a=-3;
int占32位
3的二进制表示为
原码:0000 0000 0000 0000 0000 0000 0000 0011
补码:0000 0000 0000 0000 0000 0000 0000 0011
-3的二进制数表示为
原码:1000 0000 0000 0000 0000 0000 0000 0011
补码:1111 11111 1111 1111 1111 1111 1111 1101
其实就是负数的补码

负整数转化为无符号数

整数int转无符号数
直接读取负数的补码
为了快速运算
若z是负整数,那么z对应的无符号数表达式如下:
u n s i g n e d ( z ) = 2 z 所 占 的 位 数 − ( − z ) . unsigned(z) = 2^{z所占的位数}-(-z). unsigned(z)=2z(z).

编程测试

#include
#include
using namespace std;
int main(int argc, char* argv)
{
     
	int a = -3;
	printf("占字节数:%d\n", sizeof(a));
	printf("a=%u\n", a);//输出其无符号数
	return 0;
}

运行结果,得出int占4个字节,一个字节占8位,就是32位的二进制位。
编译器-3的无符号数是4294967293
C++_int负数转unsigned_第1张图片
使用计算器检验结果是否是4294967293
计算 2 32 − 3 2^{32}-3 2323

ok,没问题!
C++_int负数转unsigned_第2张图片

你可能感兴趣的:(C++,补码,无符号数)