ホームページ >バックエンド開発 >C++ >幅を超えるシフト数で符号なし整数を右シフトするとどうなりますか?

幅を超えるシフト数で符号なし整数を右シフトするとどうなりますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-02 12:18:30776ブラウズ

What Happens When You Right Shift an Unsigned Integer with a Shift Count Exceeding Its Width?

カウントを超えた場合の右シフトの動作

シフトカウントが幅を超えた場合の C の右シフト演算の動作に関して疑問が生じます。データ型の。 C 標準によれば、負でないカウントで符号なし値を右シフトすると、元の値を 2^E2 で割った整数商が得られます。しかし、ユーザーは、Intel プラットフォーム上の GCC で予期しない動作を観察しました。

この問題は、C 標準では、正しいオペランド (シフト カウント) が指定値以上の場合の動作は未定義であると規定されているという事実に起因しています。プロモートされた左オペランドの幅 (シフトされるデータ値)。この場合、unsigned int は通常 32 ビット以下であるため、シフト カウント 34 は未定義の動作とみなされます。

GCC の警告「右シフト カウント >= 型の幅」は、この未定義の動作を示しています。アセンブリ コードで観察される結果の値 67108863 もこれを裏付けています。したがって、問題は GCC の標準実装にあるのではなく、シフト演算でデータ型の幅を超えることによって引き起こされる未定義の動作にあります。

以上が幅を超えるシフト数で符号なし整数を右シフトするとどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。