左移:最高位丢弃,最低位补0;
右移:先判定是算术右移还是逻辑右移,判定依据:看自身类型,和变量的内容无关,判定了是算术右移还是逻辑右移,才决定最高位补什么。
1、无符号数:最低位丢弃,最高位补0(逻辑右移)
2、有符号数:最低位丢弃,最高位补符号位(算术右移)
下面我们来分析一下截取的反汇编的一段核心代码:
结论:i++完整的含义是先使用,再自增,如果没有变量接收,那么直接自增(或者所谓的使用,就是读取进寄存器)
取整:
取整一共有四种方法,分别是:
1、round(向0取整)(C语言默认的取整方式)
2、floor(向负无穷大取整)
3、ceil(向正无穷大取整)
4、trunc(四舍五入取整)
下面是对应的一张表:
可以发现,某些数据的取整方法虽然不同,但是取整之后的结果是有可能相同的。
结论:浮点数(整数/整数)是有多种取整方式的。
取模&取余:
取模&取余概念:如果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!故在对其商进行取整的时候,取模等价于取余