例如,
int result;
result = 125/100;
或
result = 43/100;
结果永远是分组发言吗? 定义的行为是什么?
当结果为负数时,C将截断到0而不是地板--我在这篇文章中了解了为什么Python整数除法总是地板:为什么Python的整数除法地板
Dirkglyly对C99中的整数除法给出了很好的描述,但您也应该知道,在C89中,带负操作数的整数除法有一个实现定义的方向。
ANSI C草案(3.3.5):
如果任一操作数为负数,则/运算符的结果是小于代数商的最大整数还是大于代数商的最小整数是由实现定义的,%运算符结果的符号也是如此。 如果商a/b是可表示的,则表达式(a/b)*b+a%b应等于a。
所以当你被C89编译器困住时,要小心负数。
一个有趣的事实是,C99选择了向零截断,因为FORTRAN就是这样做的。 请参阅comp.std.c上的此消息。
结果永远是分组发言吗? 定义的行为是什么?
是的,两个操作数的整数商。
6.5.5乘法运算符
6整数除法时,/运算符的结果是去掉任何小数部分的代数商。88)如果商a/b是可表示的,则表达式(a/b)*b+a%b应等于a。
和相应的脚注:
88)这通常被称为“向零截断”。
当然需要注意的两点是:
3通常的算术转换是在操作数上进行的。
和:
5/运算符的结果是第一个操作数除以第二个操作数所得的商; %运算符的结果是余数。 在这两个操作中,如果第二个操作数的值为零,则行为是未定义的。
[注:强调我的]
问题内容: 考虑以下代码: 编译产生错误 因为表达式i / j的类型显然是int,因此必须将其强制转换为short。 为什么类型不短? 问题答案: 从Java规范: 5.6.2二进制数值提升 当运算符将二进制数值提升应用于一对操作数时,每个操作数必须表示一个数值类型的值,以下规则按顺序适用,并根据需要使用加宽转换(第5.1.2节)来转换操作数: 如果一个操作数的类型为double,则另一个将转换为
问题内容: 代码输出: 为什么值不同?为什么第二个输出看起来如此? 问题答案: 的浮点表示形式不正确: 那是因为浮点算法只是一种近似,尤其是当您超出了CPU可以准确建模的范围时(因为浮点是在硬件中处理的)。 整数除法不必将数字表示为浮点数,它只需要除以整数即可,在Python中整数可以任意增大而不会造成精度损失。 另请参阅: 浮点算法: Python教程中的 问题和局限性 每个程序员应了解的浮点运
问题内容: 给 正如它应该。然而, 给 ,但无论它是正数还是负数,我都希望它向0舍入(即,我希望-1/2为0)。最好的方法是什么? 问题答案: 进行浮点除法,然后转换为int。无需额外的模块。 Python 3: Python 2:
我做了很多操作,将数字拆分为单独的数字,将数字放入ArrayList并将这些数字一个接一个地传递给其他ArrayList以进行进一步的操作,直到temList为空-然后是下一个比前一个大的数字。 我想知道哪种方法更快。 这两种方法的共同点是: 然后我可以通过两种方式将这些数字逐个传递给其他ArrayList mainList,并在之后删除它们:方式1: 方式2: 哪种方法更快?考虑到这是数十亿次操
未定义行为的一个例子是在flow上的整数行为 有没有一个历史的或者(甚至更好!)造成这种差异的技术原因是什么?
问题内容: 我有tyo字节变量 如果我将它们求和,则求和的值为整数。 为什么a + b是int? 问题答案: 因为Java语言规范这么说 对操作数(第5.6.2节)执行二进制数值提升。 请注意,二进制数值升级执行值集转换(第5.1.13节),并且可能执行拆箱转换(第5.1.8节)。 数字操作数上加法表达式的类型是其操作数的提升类型。 并且,关于数字促销, 扩展原语转换(第5.1.2节)适用于转换以
问题内容: 我知道整数在Java中是不可变的。但是为什么要这样设计呢? 我找不到强制Integer不可变的用例。是否有类似String的技术原因? 字符串在网络连接,数据库URL等中用作参数。如果它是可变的,则很容易遭到破坏。 支持StringPool功能。 支持使用字符串作为参数的类加载机制。字符串可变会导致加载错误的类。 我知道有些包装很易变。 更新: 从对话中,并没有普遍的理由要求整数是不可
问题内容: 这听起来像一个愚蠢的问题,但是我在Java文档的任何地方都找不到答案。如果我声明两个整数然后除以它们,究竟发生了什么?它们是先转换为除法然后再转换为,还是除法为整数? 另外,纯粹从实验来看,整数除法似乎将答案舍入为零(即和)。我相信这一点对吗? 问题答案: 它们被划分为整数运算。因此简单地将整的整数你多少次装配到。还可以给您除法的余数。所以