本帖最后由 时光 于 2017-1-22 00:06 编辑
首先要了解补码的概念,相信很多同学都知道,在这里再啰嗦一下。
正整数的补码与原码相同,求负整数的补码时,符号位不变,数值位各位取反,最后整个数加1。 补码变原码时两种方法,记其一即可:一是各数值为取反,末位加1,再转换为其他进制,二是 末位减一,再取反转化其他进制。 这是书上给出的一个溢出例 子 [atta
1
[/attach]转化为二进制 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 可以进行如表格中的计算,数据的存储都是以二进制方式储存的,所以这是-32768的补码形式。 那么我们可以进行稍微的改变,
2
这又是一种情况,整型类型符的数值范围有限,转化为二进制后进行加1,如下表
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | b的值为第二行的二进制表示,而unsigned short占用2字节,共16位,所以取低16位,即b=0.
- 在看下一种
3
或许有的人对这个不理解,本人当时也是,我仍按上述方法计算,如下表
... | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ... | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | (这是我自己考虑的,就是为了凑出答案)就相当于普通的减法运算一样,向前进一位(注意是二进制的减法)
同理
4
规律就是 一个类型符取值范围中 最大值+1=最小值,最小值-1=最大值。
VC中整形变量的所占字节和取值范围
整形类型符 | 占用字节数 | 数值范围 | int | 4 | -2^31~(2^31-1) | short int | 2 | -32768~32767 | long int | 4 | -2^31~(2^31-1) | unsigned int | 4 | 0~(2^32-1) | unsigned short | 2 | 0~65535 | unsigned long | 4 | 0~(2^32-1) | (以上是我个人理解,如有错误,请各位指正)
|