C ++下溢和上溢

编程入门 行业动态 更新时间:2024-10-11 13:29:46
本文介绍了C ++下溢和上溢的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我是新来的人,因此,如果有任何问题,请告诉我,下次我会尽力而为。

Hi I am new in here so please let me know if anything is wrong and I will try to better the next time .

我试图了解C ++中下溢和上溢的工作方式。我的理解是,如果超出变量范围,它将从范围的另一端开始。因此,如果short的最小值为-32768,并且对它执行-1,则新值应为SHRT_MAX。(32767)这是我的代码:

I am trying to understand how underflow and overflow works in C++ .My understanding is if a variable's range is exceeded it will start from the other end of the range . Thus if minimum of short is -32768 and if we do a -1 to it the new value should be SHRT_MAX .(32767) Here is my code:

#include<iostream.h> #include<limits.h> #include<conio.h> int main ( void ) { int testpositive =INT_MIN ; short testnegative = SHRT_MIN ; cout<< SHRT_MIN<<"\n"; cout << testnegative-1<<"\n"; cout << INT_MIN << "\n"; cout << testpositive-1 << "\n"; cout<<testpositive-2; getch(); return 0; }

推荐答案

溢出时的确切行为/仅为 unsigned 类型指定下溢。对于普通的带符号整数类型,C ++标准只是简单地说什么都不会发生。

The exact behavior on overflow/underflow is only specified for unsigned types. For normal signed integer types instead the C++ standard simply says than anything can happen.

如果我们谈论的是x86处理器(或大多数其他现代处理器),则其行为确实是完全符合您的描述,对于CPU,有符号值或无符号值之间没有区别(有符号和无符号运算,但值本身只是位)。

If we're talking about x86 processor (or most other modern processors) indeed the behavior is exactly what you describe and for the CPU there is no difference between a signed value or an unsigned value (there are signed and unsigned operations, but the value themselves are just bits).

请注意,编译器可以假设(并且大多数现代优化编译器实际上都假设)在正确的程序中,例如在诸如以下代码中,不会发生有符号整数溢出:

Note that compilers can assume (and most modern optimizing compilers actually DO assume) that no signed integer overflow can occur in a correct program and for example in code like:

int do_something(); int do_something_else(); void foo() { int x = do_something(); int y = x + 1; if (x < y) { do_something(); } else { do_something_else(); } }

编译器可以自由跳过测试,而 else 分支完全在生成的代码中,因为在有效程序中,带符号的int x 总是小于 x + 1 (因为签名溢出不能视为有效行为)。 如果将 int 替换为 unsigned int ,则编译器必须为测试和其他代码生成代码分支,因为对于无符号类型, x> x + 1 。

a compiler is free to skip the test and the else branch in the generated code completely because in a valid program a signed int x is always less than x+1 (as signed overflow cannot be considered valid behavior). If you replace int with unsigned int however the compiler must generate code for the test and for the else branch because for unsigned types it's possible that x > x+1.

例如clang将 foo 的代码编译为

For example clang compiles the code for foo to

foo(): # @foo() push rax call do_something() pop rax jmp do_something() # TAILCALL

在这里您可以看到ode只调用 do_something 两次(对 rax 的奇怪处理除外),并且没有提及 do_something_else 实际上存在。 gcc 或多或少会生成相同的代码。

where you can see that the ode just calls do_something twice (except for the strange handling of rax) and no mention of do_something_else is actually present. More or less the same code is generated by gcc.

更多推荐

C ++下溢和上溢

本文发布于:2023-10-24 20:52:25,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1524973.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:上溢

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!