版本比较
比较
标识
- 该行被添加。
- 该行被删除。
- 格式已经改变。
整数与二进制相关的tricks。
整数
整数范围&数量级
注意一点,32位整数的数量级是40亿,也就是10^9,如果数据范围是10^9级别,则需要考虑是否要用64位整数来表示。
符号位与补码
C++支持无符号数和有符号数,重点关注有符号数的表示。
对于有符号数,最高位表示符号位,符号位为0,表示这个数是正数,否则为负数。对于负数的表示,C++使用补码来表示负数,补码等于原码除符号位外全部取反再加1。
以8位有符号数-1和-128为例,其原码,反码,补码如下:
-1:
原码 | 1000 0001 |
反码 | 1111 1110 |
补码 | 1111 1111 |
-128:
原码 | 无 |
反码 | 无 |
补码 | 1000 0000 |
一个数字从0开始不断加1,其表示的有符号数变化过程为:
- 0
- 正数不断增大
- 最大正数(符号位为0,其他全1)
- 最小负数(符号位为1,其余全0)
- 负数不断增大
- -1。
以上过程可用于判断正数累加是否溢出,即一个正数在累加的过程中突然从正数变成了负数,则表示这个数已经溢出了。
C++整数相关的常量
在头文件<limits.h>和<float.h>(C++对应为<climits>和<cfloat>)中有整数和浮点数相关的常量宏定义,可能用到的有以下几个:
宏 | 描述 | 可能值 |
---|---|---|
SHRT_MIN | short int类型的最小值 | |
SHRT_MAX | short int类型的最大值 | |
INT_MIN | int类型的最小值 | |
INT_MAX | int类型的最大值 | |
UINT_MAX | unsigned int类型的最大值 | |
LONG_MIN | ||
LONG_MAX | ||
ULONG_MAX | ||
LLONG_MIN | ||
LLONG_MAX | ||
ULLONG_MAX | ||
FLT_MIN DBL_MIN LDBL_MIN | ||
FLT_MAX DBL_MAX LDBL_MAX |
这里注意一点,对于char类型,标准并没有规定它是signed还是unsigned类型,所以没法确定CHAR_MIN的值,如果实现上把char当成有符号类型,则CHAR_MIN的值应该是-128,否则,如果实现上把char当成无符号类型,那么CHAR_MIN的值应该是0。
整数相关的tricks
补码与符号位
zigzag算法溢出问题
二进制
目录 |
---|