2

私が言えることから、「オーバーフロー」は「ナローイング」と非常によく似ています(完全に同じではないにしても)。

たとえば、値が 255 の unsigned char オブジェクト。そのビット パターンはすべて 1 になります: 1111 1111

したがって、オブジェクトに 1 を追加することによって: char_object++;

一部の一時オブジェクトで拡大が発生し、それに 1 が追加されるため、(一時オブジェクトの) ビット パターンは 256: 0000 0001 0000 0000 になります。

次に、一時オブジェクトが元のオブジェクトにコピー割り当てされ、ナローイング (左端のバイトが失われる) が発生し、値が 0 のままになります。

これがナローイングと同じように機能する場合、一部のマシンでオーバーフローが例外を引き起こすと標準が示唆しているのはなぜですか? 一部の本では、結果として未定義の動作が示唆されています。これは、ナローイングが上記のマシンで同じことを行うことを意味するのではないでしょうか? それらが同じものではない場合、それらはどのように異なるのですか?

(編集 :) おそらく、符号なし 8 ビット オブジェクトのビット パターンと符号付き 8 ビット オブジェクトのビット パターンを比較することによって、これをより明確にすることができますか? 2 の補数では、ビット パターンは変わらないようですが、表現は変わります。とにかく、これはまだ「ナロイングとオーバーフローの違いは何ですか?」という質問に真に答えているわけではありません。それらはまだ同じもののように見えるため:

#include <bitset>
#include <cstdint>
#include <iostream>

void show_bits(int8_t&);

int main()
{
    for (int8_t number{ 1 }; number; ++number)
    {
        show_bits(number);
    }
    return 0;
}

void show_bits(int8_t& number)
{
    std::cout << static_cast<int16_t>(number) << ' ';
    std::cout << '(' << static_cast<uint16_t>(static_cast<uint8_t>(number)) << ')' << '\t';
    std::bitset<sizeof(int8_t) * 8> bits_of(number);
    std::cout << bits_of << '\n';
}
4

1 に答える 1