5.1.3. 基本数据类型运算

ARM 编译器执行 ISO C99 和 ISO C++ 标准的相关部分中介绍的常见算术转换。 以下几个小节介绍了与算术运算有关的其他内容。

另请参阅表达式求值

整型运算

以下说明适用于整型运算:

  • 所有有符号的整型算法使用 2 的补码表示形式。

  • 有符号整型的位运算遵循根据 2 的补码表示形式自然形成的规则。 不会进行符号扩展。

  • 有符号量的右移是算术移位。

  • 对于 int 类型的值,

    • 没有定义在范围 0 到 127 以外的移位。

    • 超过 31 位的左移结果为零。

    • 无符号值或有符号正值超过 31 位的右移结果为零。 有符号负值的移位结果为 -1。

  • 对于 longlong 类型的值,没有定义在范围 0 到 63 以外的移位。

  • 按照 ISO C99 标准的规定,整数除法余数的符号与除数相同。

  • 如果整型值被截断为较短的有符号整型,可通过丢弃适当数量的最高有效位来获得结果。 对于新类型来说,如果原始数是太大的正或负数,则无法保证结果的符号与原始数相同。

  • 整型之间的转换不会产生异常。

  • 整数溢出不会产生异常。

  • 缺省情况下,整数被零除将返回零。

浮点类型运算

以下说明适用于浮点类型运算:

  • 标准 IEEE 754 规则适用。

  • 缺省情况下,舍入到最接近的可表示的值。

  • 缺省情况下,禁用浮点异常。

另请参阅--fpmode=model

Note

适用于浮点处理的 IEEE 754 标准规定,对异常执行的缺省操作是继续运行而不进行捕获。 可通过调整 fenv.h 中的函数和定义来修改浮点错误处理方式。 有关详细信息,请参阅第 2-73 页的调整错误信号、错误处理和程序退出

指针减法

以下说明适用于 C 中的所有指针。它们也适用于 C++ 中除指向成员的指针之外的其他指针:

  • 从一个指针中减去另一个指针时,它们的差是以下表达式的结果:

    
    ((int)a - (int)b) / (int)sizeof(type pointed to)
    
    
  • 如果指针指向的对象的对齐边界与其大小相同,这种对齐方式可保证除法的准确性。

  • 如果指针指向的对象的对齐边界小于其大小(如压缩类型和大多数 struct),则两个指针必须指向相同数组的元素。

Copyright © 2007 ARM Limited. All rights reserved. ARM DUI 0348AC
Non-Confidential