最直观的区别:有符号数的第一位表示正负,无符号数的所有位都用来表示数字大小(且全部是正数)。
计算机中的数字都是用补码表示,无符号数只有正数,所以无符号数的补码和原码相同。
虽然最常用的数据类型是 int,但为了便于书写和解释,我们使用位数更短的 short 类型。
类型 | 十进制 | 十进制幂次表示 | 二进制 |
---|---|---|---|
short | -32768 ~ 32767 | -215 ~ 215-1 | 10000000 00000000 ~ 01111111 11111111 |
unsigned short | 0 ~ 65535 | 0 ~ 216-1 | 00000000 00000000 ~ 11111111 11111111 |
有符号数与无符号数之间没有智能的转换方式,无论是使用 C 风格还是 C++ 风格,都需要自己做保护。
unsigned short static_cast<unsigned short>(data->seqNum);
TIPS:
给无符号类型赋一个超出它表示范围的初始值的时候,结果是初始值对无符号类型标识数值总数取模后的余数。例:
unsigned char c = -1; // c 的值为 255
当一个算数运算中既有无符号数又有 int 时,int 值会转换成无符号数。例:
int i = -42;
unsigned u = 10;
cout << i + u; // 输出 4294967264 (= 11111111 11111111 11111111 11010110 + 00000000 00000000 00000000 00000010 = 4294967254 + 10)
网友评论