有符号数
有符号数中有一个符号位,正数为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<iostream> #include<math.h> 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
使用计算器检验结果是否是4294967293
计算2 32 − 3 2^{32}-3232−3
ok,没问题!