求余或求模有负数参与, 不同语言结果不同?编程语言运算符?基本运算?

目录

求余或求模有负数参与, 不同语言结果不同?

标准文档的规定

特殊的求模

编程语言运算符

基本运算符支持

优先级

除0

基本运算

不同的除法

除法的余数?

求幂

求模


求余或求模有负数参与, 不同语言结果不同?

不止是除法,求余或求模一旦有负数参与,结果可能都有差异。本质在于不同语言使用不同求余规则。

  • 向零取整
    向 0 方向取最接近精确值的整数,C/ObjC/C++/Rust/C#/Java/Go/Swift/JS/VB/仓颉/PHP/Kotlin 等语言都采用这种方式。
    • 按此规则,被求模的数值是负数,求模的数值也是负数。
  • 向下取整
    向负无穷方向取最接近精确值的整数,Python采用这种方式(Python2/3都遵循)。
  • 向上取整
    向正无穷方向取最接近精确值的整数。

所以问题就简单了:

  • C语言
    9 / -4 == -2.25, 向0取整得到结果-2,推算9 % -4 == 9 - (-2 * -4) == 1.
  • Python
    9 / -4 == -2.25, 向下取整得到结果-3,推算9 % -4 == 9 - (-3 * -4) ==-3.

标准文档的规定

  • C语言C89规定,当除数和被除数有负数时,商和余数的符号是未定义行为。C99开始,此行为被约束为固定行为,即向零取整。
    • C89 6.3.5章节:"If either operand is negative. whether the result of the / operator is the
      largest integer less than or equal to the algebraic quotient or the smallest integer greater than or equal to the algebraic quotient is implementation-defined."
    • C99 6.5.5章节:"When integers are divided, the result of the / operator is the algebraic quotient with any fractional part discarded.”

特殊的求模

  • VB 语言用浮点数求模,会先把浮点数转换成整数再求模:
    12.5 Mod 4.6 等价于 12 Mod 4, 得到3.

编程语言运算符

不支持运算符的编程语言应该没有人会用,包括汇编语言都是用指令代替了运算符。定义基本的运算符如下:+ - * / %

基本运算符支持

  • C/ObjC/C++/Java/C#/Python/JS/Rust/Go/Swift/仓颉/VB/Fortran/PHP/Kotlin 等均支持。
  • Python “/”代表全除,"//"代表整除。
  • Pascal 不支持 % , 运算符 / 代表实数运算而非整数运算,div 用于整数除法,mod 整数求余。

优先级

  • * / % 优先级相同,左结合,都比 + - 优先级高。
  • + - 优先级相同,左结合。

除0

  • C# 整数除以0会有编译错误或运行时提示"DivideByZeroException",浮点数除以0会得到Infinity或-Infinity. 浮点数0除以0会得到NaN.

基本运算

编程语言基本数据类型的加减乘除,看起来都很像。它们都和数学公示很像,除了乘法不能用X或x,这个是字母,除法不能用÷,因为这个字符在键盘上看不到。

  • + - * / %
    • C/ObjC/C++/C#/Java/Python/Fortran/Ada/Ruby/JS/Rust/Go/Swift/仓颉/VB/Fortran/PHP/Kotlin  等均支持。
      • VB 支持前四种,求模是用MOD而非%, VB "/" 特殊一些,代表浮点除。

不同的除法

  • Python “/”代表全除,"//"代表整除。
  • VB "/" 代表浮点数除法,"\" 和C语言的整数除法一样。

除法的余数?

  • C/ObjC/C++ 等语言的整数除法默认会丢弃余数,Java/C#一样。
  • Python提供/和//分别代表不舍弃和舍弃的除法,更加清楚。当然,Python是脚本类语言,/ 运算得到最精确的结果是符合预期的。
    • 注意 "//" 是Python 2.2版本开始支持。
  • ML语言用div和/区分出整数除法和浮点数除法,清晰度也很高。

求幂

  • 大部分编程语言都不支持求幂,因为它不常用,不作为首选。
    C/ObjC/C++/C#/Java 等均没有求幂运算符。
  • Fortran/Ada/Ruby/VB/Python 有求幂运算符,VB用^, Fortran/Ada/Ruby/Python用**.
  • Python的幂运算符优先级最高。

求模

  • 大部分C系编程语言用%作为求模,且必须是整型变量,不能有浮点数。
  • VB用MOD求模。
  • C语言浮点数求模用fmod标准函数。


若文章对您有帮助,欢迎关注 程序员小迷 。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是 程序员小迷 (致力于C、C++、C#、Android、iOS、Java、Kotlin、Objective-C、Swift、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值