c++primer 2.1.2含有无符号数类型的表达式

含有无符号类型的表达式

当一个算数表达式中既有无符号数又有int值时,int值会转换成无符号数。

unsigned u = 10;
int i = -42;
std::cout << i + i << std::endl;//输出-84
std::cout << u + i << std::endl;//如果int占32位,输出4294967264

第二个输出表达式里,相加前先把整数-42转为无符号数。

计算机中负数通过补码表示。

有符号数和无符号数计算过程无符号首先会转化为无符号数,

42的二进制表达式为:00000000  00000000  00000000  00101010

                   反码为:11111111  11111111  11111111   11010101

                  补码为:11111111   11111111  11111111   11010110(-42)

所以该补码若是表示无符号数,大小为:4294967254,然后加10,结果即为4294967264(相当于32位全1结果为4294967295,然后减去41即为有符号数-42代表的无符号数大小。
————————————————
原文链接:https://blog.csdn.net/qq_28734159/article/details/80835558


 当从无符号数中减去一个值时,不管这个值是不是无符号数,我们都必须确保结果不能是一个负值

unsigned u1 = 42,u2=10;
std::cout << u1-u2 << std::endl;//正确,输出32
std::cout <

无符号数不会小于0,同样关系到循环的写法。例如,1.4.1节练习中需要写一个循环,通过控制变量递减方法把10到0的数字降序输出。这个循环可能类似下面的形式

for(int i=10;i>=0;--i)
std::cout<

可能你觉得反正也不打算输出负数,可以用无符号数来重写这个循环。然而,这个改变意味着死循环。

//错误,变量i永远也不会小于零,循环条件一直成立
for(unsigned i=10;i>=0;--i)
std::cout<

分析:当i等于0时,迭代输出0,后续执行for语句里的表达式。表达式--i从i当中减去了1,得到的结果-1并不满足无符号数的要求,此时像所有表示范围之外的其他数字一样,被自动转换为一个合法的无符号数。假设int类型占32位,则当i=0时,--i的结果将会是4294967295.

一种解决的办法是,用while语句来代替for语句,因为前者让我们能够在输出变量之后(而非之前)先减去1:

unsigned u = 11;//确定要输出的最大数,从比它大的1开始
while (u > 0)
{
	--u;//先减一,这样最后一次迭代时就会输出0
	std::cout << u << std::endl;
}

改写后的循环先执行对循环变量减一的操作,这样最后一次迭代时,进入循环的u值为1。此时将其减一,则这次迭代输出的数就是0;下一次再检验循环条件时,u的值等于0而无法再进入循环。因为我们要先做减一的操作,所以初始化u的值应该比要输出的值大1,这里,u初识化为11,输出的最大数是10。


递归(recursion):递归常被用来描述以自相似方法重复事物的过程,在数学和计算机科学中,指的是在函数定义中使用函数自身的方法。(A调用A)
迭代(iteration):重复反馈过程的活动,每一次迭代的结果会作为下一次迭代的初始值。(A重复调用B)。(aka:重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。此过程的每一次结果,都是由对 前一次所得结果 施行相同的运算步骤 得到的)


练习2.3

读写程序结果

答:

unsigned u = 10, u2 = 42;
std::cout << u2-u << std::endl;//正确,32
std::cout << u - u2<< std::endl;//正确,结果为取模后的值

int i=10, i2 = 42;
std::cout << i2 - i<< std::endl;//正确,32
std::cout << i- i2 << std::endl;//正确,-32
std::cout << i-u << std::endl;//正确,0
std::cout << u-i << std::endl;//正确,0

不要在同一个表达式中混合使用无符号类型和带符号类型,因为计算前会将带符号类型转为无符号类型,当带符号类型取值为负数时会出现异常结果。

依然不明白无符号类型的转换,取模,看了很多别人的文章,之后整理新的一篇,理顺思路)

你可能感兴趣的:(c++,primer,c++,算法,学习,笔记)