对常量和变量进行除法运算有什么区别

用户5155804

根据此链接,执行 INT_MIN / -1 除法运算将导致程序在 i386 CPU 中终止。我的处理器是 32 位架构,我使用 GCC 编译器。我做了以下实验来检查它。

int a = INT_MIN;
int b = -1;
int c = a / b;
printf("%d\n",c);

根据上面提到的链接中指定的信息,该程序终止并抛出浮点异常。但是当我以不同的方式尝试时,情况就不一样了。


int c = INT_MIN / -1;
printf("%d\n",c);  

编译器在编译此程序后抛出以下警告。

iso.c:在函数“main”中:
iso.c:6:18:警告:表达式中的整数溢出 [-Woverflow]
int c = INT_MIN / -1;
_____________^

但我得到了输出 -2147483648。我再一次做了两个实验。


int a = INT_MIN;
int b = -1;
printf("%d\n",a / b);

这是一个浮点异常。


printf("%d\n",INT_MIN / -1);

这引发了以下编译器警告。

iso.c:在函数“main”中:
iso.c:6:24:警告:表达式中整数溢出 [-Woverflow]
printf("%d\n",INT_MIN / -1);
__________________^

而这个程序的输出又是-2147483648。


在做了所有这些实验之后,我注意到直接对常量进行除法运算的结果与对变量进行除法运算的结果不同。那么究竟是什么造成了这种差异呢?

塞尔吉·巴列斯塔

根据标准,这两个结果都是可接受的。C99 的 n1256 草案说(强调我的):

6.5 表达式
...
5 如果在表达式求值过程中出现异常情况(即,如果结果未在数学上定义或不在其类型的可表示值范围内),则行为未定义。

在2的补码整数表示,INT_MIN/-1INT_MAX + 1这样的动作调用未定义行为,所以任何结果(包括崩溃)是可以接受的

正如@tilz0R 在他的评论中所解释的,当值在变量中传递时,操作在运行时执行并引发 SIGFPE 信号。但是当操作只涉及编译时常量时,该操作由编译器在编译时执行。在 gcc 实现中,编译器保护自己免受错误的影响,并简单地将其最佳表示用于INT_MAX + 1. 在 32 位 2 的补码实现中,INT_MAX 是 0x7fffffff,所以 INT_MAX + 1 是(有符号溢出后)0x80000000 或 INT_MIN (-2147483648)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

变量 === 常量和常量 === 变量有什么区别

来自分类Dev

浮点变量printf和常量之间有什么区别?

来自分类Dev

java中的常量变量和最终变量之间有什么区别?

来自分类Dev

:=和=运算符有什么区别?

来自分类Dev

!=和<>运算符有什么区别?

来自分类Dev

Comparable和运算符compareTo有什么区别?

来自分类Dev

:=和=运算符有什么区别?

来自分类Dev

vhdl +运算符和+函数有什么区别?

来自分类Dev

Autohotkey::= 和 = 赋值运算符有什么区别

来自分类Dev

C初始化程序元素不是常量[数组和变量之间有什么区别]

来自分类Dev

“ $(变量)”和“ $(变量)”之间有什么区别

来自分类Dev

“ $(变量)”和“ $(变量)”之间有什么区别

来自分类Dev

(cast)变量和((cast)变量)有什么区别

来自分类Dev

使用“let”和“let”有什么区别?和“变量”?

来自分类Dev

Javascript私有变量和参数有什么区别?

来自分类Dev

使用变量定义数组大小和使用新的运算符 c++ 有什么区别?

来自分类Dev

在php中进行消毒和验证有什么区别?

来自分类Dev

在Safari和Webkit上进行测试有什么区别?

来自分类Dev

枚举和最终变量之间有什么区别?

来自分类Dev

静态const和constexpr变量有什么区别?

来自分类Dev

Ruby中的符号和变量之间有什么区别?

来自分类Dev

字段和变量之间有什么区别?

来自分类Dev

javascript属性和javascript变量有什么区别?

来自分类Dev

在Tensorflow中,变量和张量之间有什么区别?

来自分类Dev

Swift中的属性和变量之间有什么区别?

来自分类Dev

操作参数和GraphQL变量之间有什么区别?

来自分类Dev

更改变量的值时,+ =和=有什么区别?

来自分类Dev

sass中的变量和mixin有什么区别?

来自分类Dev

常量和静态变量有什么区别,我应该选择哪个?

Related 相关文章

  1. 1

    变量 === 常量和常量 === 变量有什么区别

  2. 2

    浮点变量printf和常量之间有什么区别?

  3. 3

    java中的常量变量和最终变量之间有什么区别?

  4. 4

    :=和=运算符有什么区别?

  5. 5

    !=和<>运算符有什么区别?

  6. 6

    Comparable和运算符compareTo有什么区别?

  7. 7

    :=和=运算符有什么区别?

  8. 8

    vhdl +运算符和+函数有什么区别?

  9. 9

    Autohotkey::= 和 = 赋值运算符有什么区别

  10. 10

    C初始化程序元素不是常量[数组和变量之间有什么区别]

  11. 11

    “ $(变量)”和“ $(变量)”之间有什么区别

  12. 12

    “ $(变量)”和“ $(变量)”之间有什么区别

  13. 13

    (cast)变量和((cast)变量)有什么区别

  14. 14

    使用“let”和“let”有什么区别?和“变量”?

  15. 15

    Javascript私有变量和参数有什么区别?

  16. 16

    使用变量定义数组大小和使用新的运算符 c++ 有什么区别?

  17. 17

    在php中进行消毒和验证有什么区别?

  18. 18

    在Safari和Webkit上进行测试有什么区别?

  19. 19

    枚举和最终变量之间有什么区别?

  20. 20

    静态const和constexpr变量有什么区别?

  21. 21

    Ruby中的符号和变量之间有什么区别?

  22. 22

    字段和变量之间有什么区别?

  23. 23

    javascript属性和javascript变量有什么区别?

  24. 24

    在Tensorflow中,变量和张量之间有什么区别?

  25. 25

    Swift中的属性和变量之间有什么区别?

  26. 26

    操作参数和GraphQL变量之间有什么区别?

  27. 27

    更改变量的值时,+ =和=有什么区别?

  28. 28

    sass中的变量和mixin有什么区别?

  29. 29

    常量和静态变量有什么区别,我应该选择哪个?

热门标签

归档