22

整数セキュリティに関する記事を読んでいます。リンクはこちら: http://ptgmedia.pearsoncmg.com/images/0321335724/samplechapter/seacord_ch05.pdf

166ページに次のように書かれています。

結果の符号なし整数型で表すことができない結果は、結果の型で表すことができる最大値よりも 1 大きい数値に剰余で減らされるため、符号なしオペランドを含む計算はオーバーフローすることはありません。

どういう意味ですか?返信ありがとうございます。

4

3 に答える 3

37

値が「ラップアラウンド」することを意味します。

UINT_MAX + 1 == 0
UINT_MAX + 2 == 1
UINT_MAX + 3 == 2

.. 等々

リンクが示すように、これはモジュロ演算子のようなものです: http://en.wikipedia.org/wiki/Modulo_operation

于 2013-04-17T09:47:36.463 に答える
5

オーバーフローしない?

ここでの「オーバーフロー」とは、「オペランドに適合しない値を生成する」ことを意味します。算術モジュロが適用されるため、値は常にオペランドに適合し、オーバーフローは発生しません。

つまり、オーバーフローが実際に発生する前に、C++ は既に値を切り捨てています。

モジュロ?

他の値を法として値を取るということは、除算を適用し、剰余を取ることを意味します。

例えば:

0 % 3 = 0  (0 / 3 = 0, remainder 0)
1 % 3 = 1  (1 / 3 = 0, remainder 1) 
2 % 3 = 2  (2 / 3 = 0, remainder 2)
3 % 3 = 0  (3 / 3 = 1, remainder 0)
4 % 3 = 1  (4 / 3 = 1, remainder 1)
5 % 3 = 2  (5 / 3 = 1, remainder 2)
6 % 3 = 0  (6 / 3 = 2, remainder 0)
...

このモジュロは、型が保持できる最大値を除数として、符号なしのみの計算の結果に適用されます。たとえば、最大値が 2^16=32768 の場合、32760 + 9 = (32760 + 9) % (32768+1) = 0.

于 2013-04-17T09:48:37.597 に答える
4

つまり、unsigned計算の符号を変更することはできませんが、それでも予期しない結果が生じる可能性があります。8 ビットの符号なし値があるとします。

 uint8_t a = 42;

これに 240 を追加します。

 a += 240;

収まらないので、26 になります。

符号なしの数学は、C および C++ で明確に定義されています。ここで、符号付きの数学は、技術的に未定義であるか、実装に依存しているか、またはその他の「予期しないことが起こる可能性がある」という文言です (正確な文言はわかりませんが、結論としては、 「符号付き整数値のオーバーフローの動作に依存するべきではありません」)

于 2013-04-17T09:50:39.533 に答える