1.关于无符号数和有符号数的运算
关于无符号数和有符号数的运算,在我看来一直是觉得只要有无符号数和有符号数的运算,有符号数就转化为无符号数,但是在《C++ Primer 第五版》的p142介绍,关于无符号数和有符号数的运算如下规定的:
(1)无符号数类型>=有符号类型(一直不理解这里的不小于是什么意思),则带符号的运算对象转换为无符号。
(2)无符号数类型<有符号类型,转换结果和机器有关。如果无符号类型的所有值都能在有符号的类型中找到对应(也就是说有符号类型最起码比无符号类型的数据范围宽),则无符号类型转换为有符号类型,否则有符号类型转化为无符号类型。
为了验证上述理论,在VS2015下编写如下测试代码:
(1)测试代码案例1:-3 ( int ) + 5( unsigned int )
(2) 测试代码案例3: -7 ( long long ) +5 ( unsigned int )
(3) 测试代码案例2:-7 ( int ) + 5 (unsigned int )
三个测试代码案例分别对应上述所示三种情况:1)无符号类型数5>有符号类型数3,有符号的数变为无符号的数,则-3变成无符号数4294967293,和5做加法后得到4294967298,超出了32位无符号的最大值4294967295,则得到的值为4294967298%4294967296=2;2)无符号类型的数5<有符号类型的数-7,且unsigned int类型的数都能在long long里面找到对应的数,因此无符号类型的数转化为有符号的数,结果为-7+5=-2;3)无符号类型的数5<有符号类型的数-7,但是unsigned int类型里面有一半的数在int类型里面找不到对应的数,因此有符号的数转化为无符号的数,-7转化为4294967289,加上5之后,结果就变为4294967294.
因此,得出结论,书中p142页所讲的无符号类型的大小比较,其实是两个数的绝对值比较。