环境:Win7 x64,32G内存,8核,2.7GHz,VS2015
目标:C++ int赋值
测试:
如上图所示: count1= 1e9时,count1 = 1 000 000 000;
count2=1e10时,count2 =1 410 065 408;
为什么 count2 != 10 000 000 000?
分析:
VS2015下测试int占用4个字节,也就是32位,除了第一位代表符号,剩下的31位可用。
十进制的 1e10时,转换为二进制:10 0101 0100 0000 1011 1110 0100 0000 0000
而0101 0100 0000 1011 1110 0100 0000 0000 转换成十进制就是 1 410 065 408
百度搜了一下:
C/C++中int类型是32位的,范围是-2147483648 到 2147483647
结论:使用int 变量时,一定注意范围。
拓展:
C/C++ 规定 类型的范围区间为 -2的(n-1)次方 ----- 2的(n-1)次方-1
以字符char 为例,占用一个字节,那么它可以表示的区间就是 -128 -- 127, 共256个数
那么问题来了,如果给char变量复制 128,会发生什么?调试结果char的值居然是 -128!
这里可以将值的变化当成进度条来看,
当值大于127时,会回到-128,然后继续向右走,也就是说:
128 == -128
129 == -127
130 == -126
.......
从而得到数值会在256个数上依次循环,而256就是2的8次方。
所以计算真实值时,按照以下步骤:
1. 先求余数,X = X / (2的n次方)
2. 判断是否在值范围区间,比如 (-128,127), 在区间内,直接返回
3. 如果不在,正数 - (2的n次方), 负数 + (2的n次方)
二进制求值: 截断合适的位数,求值,然后通过上面步骤计算
值求二进制:
1. 先求余数,X = X / (2的n次方)
2. 如果是负数,负数 + (2的n次方)