3

マイクロチップ18f4620PICでの作業。ただし、これは標準のANSICの質問です。

私が持っていると言う

unsigned int16 badFlow=65535 //max unsigned int16 value

これのバイナリ値は1111 1111 1111 1111です。

もし私が

badFlow++;

ビットパターンは1 0000 0000 0000 0000 17ビットになります。明らかにbadFlow == 0、しかし追加の反転ビットはどちらか

  1. 破棄されます
  2. またはどこにでも存在しますbyte* flowPtr = &badFlow+2;

私は後者を想定していますが、前者を望んでいます。

私の問題:同僚が、製造されたすべての製品で約2年間オーバーフローしているカウンターを使用して、いくつかの悪いコードを作成しました。これらのツールの使用に対してお客様が請求する金額を考慮すると、データが不良である可能性があるため、数百万ドルの危険があります。

4

6 に答える 6

7

Cの算術演算は、メモリ内のバイトではなく、値を使用して行われます。あなたの表現badFlow++は。と同等badFlow = badFlow + 1です。右側はタイプとして評価されint(デフォルトのプロモーションのため、int16ビットより大きいと仮定します。16ビットintしかない場合はとして評価されますunsigned int)、65536になり、65536が符号なし16ビット変数に割り当てられます。 、65536を法として減少し、結果は0になります。

この答えから抜け出すための重要なことはbadFlow++、でのメモリに対する直接操作ではないということです(ただし、一部の実装ではそのように実装される&badFlow可能性があります)。これは、単に追加と割り当ての省略形です。

于 2012-01-09T18:41:23.323 に答える
5

最上位桁は破棄されます。多くのプロセッサには、オーバーフローが発生したことを示すステータスレジスタがありますが、Cからは表示されません(使用するにはアセンブリで作業する必要があります)

于 2012-01-09T18:30:45.207 に答える
4

オプション1は正しく、オーバーフローはサイレントに破棄されます。

于 2012-01-09T18:30:34.317 に答える
4

標準Cの整数型のオーバーフローまたはアンダーフローは、一般に安全な操作であり、アクセスされる変数の範囲を超えてメモリを変更することはありません。標準Cでは、オーバーフロービットは破棄されますが、実装では特別なオーバーフローレジスタまたは専用のメモリ位置に格納される場合があります。たとえば、i386システムでは、オーバーフローは「キャリーフラグ」で通知されます。

編集:@aixが指摘しているように、キャリーフラグは関連するすべてのi386アセンブリ命令によって更新されるわけではありません。もちろん、これは実装の詳細です。C言語では、キャリーフラグについて2つの問題はありません。

編集2:そしてR.が指摘しているように、署名されたオーバーフローは未定義の動作ですが、私が見たすべての実装はそれを安全に処理します。

于 2012-01-09T18:31:09.277 に答える
4

に続くメモリにはオーバーフローしませんbadFlow

于 2012-01-09T18:29:41.480 に答える
0

uint32新しいソフトウェアリリースに移行して作成するのが正しい方法です。

于 2012-01-09T18:32:07.717 に答える