What & How & Why

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
cs:programming:cpp:cpp_primer:4_expressions [2024/09/21 06:47] – [表达式判定顺序] codingharecs:programming:cpp:cpp_primer:4_expressions [2024/09/22 13:25] (当前版本) – [除法、末除和符号] codinghare
行 87: 行 87:
 iv % dv; //error iv % dv; //error
 </code> </code>
-C++11 中, 如果 ''m'' ''n'' 均为**非零整数**,有 ''m = (m / n) * n + m%n''。也就是说,''m%n'' 与 ''m'' 同号(早期的标准允许 ''m%n'' 向负无穷方向取整,但现在已经被禁止了)。因此,除非 ''-m'' 有溢出导致符号变化(比如 -127 溢出为 128),总有 ''m'' 与 ''m%n'' 同号。该规则只适用于**末除**,即:+C++11 中, 如果 ''m'' ''n'' 均为**非零整数**,有 ''m = (m / n) * n + m%n''。也就是说,''m%n'' 与 ''m'' 同号(早期的标准允许 ''m%n'' 向负无穷方向取整,但现在已经被禁止了)。因此,除非 ''-m'' 有溢出导致符号变化(比如 -127 溢出为 128),总有 ''m'' 与 ''m%n'' **同号**。该规则只适用于**末除**,即:
   * (-m) / n 和 m / -n 均等于 -(m/n)   * (-m) / n 和 m / -n 均等于 -(m/n)
   * m%(-n) 等于 m%n,而 (-m)%n = -(m%n)   * m%(-n) 等于 m%n,而 (-m)%n = -(m%n)
行 386: 行 386:
   * **整型提升**(//Intergral Promotion//): 小于 int 的类型,比如 bool / char /short 会在不超出范围内的情况下转化为 int; 在超出 int 表示的范围后转化为 unsigned int。   * **整型提升**(//Intergral Promotion//): 小于 int 的类型,比如 bool / char /short 会在不超出范围内的情况下转化为 int; 在超出 int 表示的范围后转化为 unsigned int。
   * 运算转化:为了保证运算 operand 的类型一致而存在的转换。转换的规则取决于是否有 unsigned 类型的参与(见图):   * 运算转化:为了保证运算 operand 的类型一致而存在的转换。转换的规则取决于是否有 unsigned 类型的参与(见图):
-<html><div align="center"> +{{ :cs:programming:cpp:cpp_primer:unsigned_conversion.svg?500 |}}
-<img src="/_media/programming/cpp/cpp_primer/unsigned_conversion.svg width="500"/> +
-</div> +
-</html> +
-\\+
  
 需要说明的是,//unsigned fit signed// 在这里指的是 signed operand 比 unsigned operand 大一号,并且可以表示 unsigned type。 按书上的例子来说,如果 ''long'' 大于 ''int'' ,且 unsigned int 所有的值都可以用 long 表示,那么所有的 unsigned int 都会被转化成 long。\\ \\ 需要说明的是,//unsigned fit signed// 在这里指的是 signed operand 比 unsigned operand 大一号,并且可以表示 unsigned type。 按书上的例子来说,如果 ''long'' 大于 ''int'' ,且 unsigned int 所有的值都可以用 long 表示,那么所有的 unsigned int 都会被转化成 long。\\ \\