左移(<<),右移(>>), (i++ 如果没有接收方,那么“先使用”,如何理解?),取余和取模一样吗?

左移:最高位丢弃,最低位补0;

右移:先判定是算术右移还是逻辑右移,判定依据:看自身类型,和变量的内容无关,判定了是算术右移还是逻辑右移,才决定最高位补什么。

1、无符号数:最低位丢弃,最高位补0(逻辑右移)

2、有符号数:最低位丢弃,最高位补符号位(算术右移)

左移(<<),右移(>>), (i++ 如果没有接收方,那么“先使用”,如何理解?),取余和取模一样吗?_第1张图片

 下面我们来分析一下截取的反汇编的一段核心代码:

左移(<<),右移(>>), (i++ 如果没有接收方,那么“先使用”,如何理解?),取余和取模一样吗?_第2张图片

 结论:i++完整的含义是先使用,再自增,如果没有变量接收,那么直接自增(或者所谓的使用,就是读取进寄存器)

取整:

取整一共有四种方法,分别是:

1、round(向0取整)(C语言默认的取整方式)

2、floor(向负无穷大取整)

3、ceil(向正无穷大取整)

4、trunc(四舍五入取整)

下面是对应的一张表:

左移(<<),右移(>>), (i++ 如果没有接收方,那么“先使用”,如何理解?),取余和取模一样吗?_第3张图片

左移(<<),右移(>>), (i++ 如果没有接收方,那么“先使用”,如何理解?),取余和取模一样吗?_第4张图片 

 可以发现,某些数据的取整方法虽然不同,但是取整之后的结果是有可能相同的。

结论:浮点数(整数/整数)是有多种取整方式的。

取模&取余:

取模&取余概念:如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数q和r,满足a=q*d+r且

0<=|r|<|d|,其中q被称为商,r被成为余数。

在C语言中,-10%3=-1(因为C语言采用的是向0取整,所以是商3余-1(负余数))

但是在python中,-10%3=2(原因是python中采用了向负无穷取整,所以是商-4余2(正余数))

取余和取模一样吗?

其实这两个并不是严格上的相等。

本质1取整:

取余:尽可能让商,进行向0取整。

取模:尽可能让商,向负无穷方向取整

故:

C语言中的%,本质其实是取余。

python中的%,本质其实是取模。

理解链:

对于任意一个大于0的数,对其进行0向取整和负无穷取整,取整方向是一致的,故取余等价于取模。

对任何一个小于0的数,对其进行0向取整和负无穷取整,取整方向是不一致的,故取余不等价于取模。

同符号数据相除,得到的商一定是正数,即大于0!故在对其商进行取整的时候,取模等价于取余

你可能感兴趣的:(c语言)