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

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

左移:最高位丢弃,最低位补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!故在对其商进行取整的时候,取模等价于取余


相关文章
|
26天前
【编程基础知识】正数负数的二进制位运算(左移 右移 无符号右移)
正数和负数需转换成二进制后进行移位运算。左移低位补0,不影响符号位;右移符号位跟随移动,最高位还原为原符号位;无符号右移高位补0,适用于负数处理。
65 0
|
6月前
|
运维 安全 Devops
什么是安全左移,如何实现安全左移
传统软件开发面临安全挑战,如意识缺失、代码漏洞、第三方组件风险、配置管理问题及应对新型攻击能力不足。为改善现状,需采取安全左移策略,将安全措施提前至开发早期,与SDL结合,确保安全贯穿SDLC始终。安全左移面临计划制定、责任转移、工具选择等挑战,需通过规划、培训和选用合适工具应对。DevSecOps模式进一步将安全融入DevOps,提升开发效率和软件安全性,实现开发、安全和运维的协同。SDL与DevSecOps相辅相成,前者注重安全过程,后者强调安全文化与自动化。
279 1
什么是安全左移,如何实现安全左移
|
6月前
|
算法 测试技术 C++
【位运算 拆位法】1835. 所有数对按位与结果的异或和
【位运算 拆位法】1835. 所有数对按位与结果的异或和
|
6月前
|
C语言
C语言自增减、逻辑运算、位运算、位移运算及三目运算操作
C语言自增减、逻辑运算、位运算、位移运算及三目运算操作
47 0
|
C语言
C语言之将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
C语言之将长整型数中每一位上为奇数的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。
244 0
|
Java C++ Python
负数取余,取余和取模
负数取余,取余和取模
算数右移和逻辑右移的区别及逻辑运算的窍门
算数右移和逻辑右移的区别及逻辑运算的窍门
682 0
|
C语言 Python
【C语言】负数取模、取余
首先谈谈关于数学取整的问题
|
Java Python
进制的底层逻辑规则 左移<< 右移>> 取反加一 补位原则 正负数 相反数等 文章中含验证源码
进制的底层逻辑规则 左移<< 右移>> 取反加一 补位原则 正负数 相反数等 文章中含验证源码
145 0
进制的底层逻辑规则 左移<< 右移>> 取反加一 补位原则 正负数 相反数等 文章中含验证源码