C++

tech2025-10-07  2

有符号数和无符号数

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

有符号数

有符号数中有一个符号位,正数为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}-3 2323 ok,没问题!

最新回复(0)