一: 起因
(1)最近接触了类型转换,例如有符号数转化为无符号数 ---- int 转化为 unsigned int类型,莫要想当然的转化;
(2)弥补一下自己当初学习计算机组成原理时,原码、反码、补码就比较容易混淆的概念;
(3)double类型的如何判断某一个参数是否为零,直接 == 0.0,,貌似可以 ---- 确实有时可以,但是有时却不可以,这是为什么?
(4)知识补充:在int 有符号数中:0x80000000 (除了符号位为1,其余全部为零) ---- 最小的数(-2147483648即-2^32) ;
0x80000001 ---- 次最小数( -2147483647即-2^32-1);
0xFFFFFFFE (-2) ;0xFFFFFFFF(连同符号位全部是1) ----- 最大的负整数(-1);
0x7FFFFFF (除了符号位为0,其余全部为1)---- 最大的数(2147483647即2^32-1)
(5)问题是 0x80000000 - 1 是多少呢?(最大的数0x7FFFFFF); 0x7FFFFFF
+ 1又是多少呢?(最小的数0x80000000 );
0x80000000 - 1 是如何计算的吗?(0x80000000 + 0xFFFFFFFF,先把减法变化为加法,即正1变化为负1,溢出位舍掉)
二:看真相
(1)代码
int min_int = 0x80000000; int int_fu1 = 0xffffffff; int max_int = 0x7FFFFFFF; cout << "min_int= " << min_int << "\tmin_int-1= " << min_int-1 << "\t(unsigned)min_int = " << (unsigned int)min_int << endl; cout << "int_fu1= " << int_fu1 << "\tint_fu1-1= " << int_fu1-1 << "\t(unsigned)int_fu1 = " << (unsigned int)int_fu1 << endl; cout << "0x7FFFFFFF= " << 0x7FFFFFFF << "\t0x7FFFFFFF-1= " << 0x7FFFFFFF +1 << endl; double test_zero = 1.333333; cout << (test_zero-1.3333334) << endl; if(0 == (test_zero-1.3333334)) cout << "(test_zero-1.3333334) = " << (test_zero-1.3333334) << "\t0 == (test_zero-1.3333334)" << endl; else if((test_zero-1.3333334)>-1e-6 && (test_zero-1.3333334) < 1e-6) cout << "(test_zero-1.3333334) = " << (test_zero-1.3333334) << "\t(test_zero-1.3333334)>-1e-6 && (test_zero-1.3333334) < 1e-6" << endl;
(2)结果图
(3)结果分析
浮点数(double)之所以不能用 == 和 != 是因为浮点数在内存中都是按精度来存储的(有最大精度位数,也可以设定精度位数),所以你看到的 3.12也许本来是3.123456取的小数点后2位位精度,所以当与另一个 3.12进行比较时可能会出现很多种情况,如果另一个3.12其实是3.121111取的小数点后2位位精度的话,那么两个数你看着相等,其实是不等的。
所以你办在对浮点数进行比较的时候一般都是相减然后去和一个精度比较。但是有时,比较确实可以通过,因为那是侥幸。
可以看到最小数 和 最大数之后一步之遥。
原码 反码 补码 的知识补充
(4)相关学习 c++中的悬浮指针和野指针
二级指针 我不是一个合格的程序员 再一次感觉到自己的无知
c++深拷贝和浅拷贝
面试经常问的C语言变量在内存中的分布(VC6.0)