[解決済み] 8ビット整数から8ビットより大きな値を得るにはどうしたらよいですか?
2022-08-31 20:53:29
質問
私は、この小さな宝石の背後に隠れている非常に厄介なバグを突き止めました。C++ 仕様では、符号付きオーバーフローは未定義の動作であることは承知していますが、オーバーフローが発生するのは、値がビット幅
sizeof(int)
. 私が理解しているように
char
である限り、未定義の動作になることはないはずです。
sizeof(char) < sizeof(int)
. しかし、それでは
c
が
不可能
の値を取得します。8 ビット整数として、どのように
c
はそのビット幅より大きな値を保持できるのでしょうか?
コード
// Compiled with gcc-4.7.2
#include <cstdio>
#include <stdint.h>
#include <climits>
int main()
{
int8_t c = 0;
printf("SCHAR_MIN: %i\n", SCHAR_MIN);
printf("SCHAR_MAX: %i\n", SCHAR_MAX);
for (int32_t i = 0; i <= 300; i++)
printf("c: %i\n", c--);
printf("c: %i\n", c);
return 0;
}
出力
SCHAR_MIN: -128
SCHAR_MAX: 127
c: 0
c: -1
c: -2
c: -3
...
c: -127
c: -128 // <= The next value should still be an 8-bit value.
c: -129 // <= What? That's more than 8 bits!
c: -130 // <= Uh...
c: -131
...
c: -297
c: -298 // <= Getting ridiculous now.
c: -299
c: -300
c: -45 // <= ..........
ideoneでチェックする。
どのように解決するのですか?
未定義の動作のために不可能な結果を得ることは正当な結果ですが、実際にはあなたのコードに未定義の動作はありません。起こっているのは、コンパイラが が考えていることです。 と考え、それに応じて最適化しているのです。
もし
c
が定義されている場合
int8_t
であり
int8_t
に昇格します。
int
となり、次に
c--
は減算を行うことになっています
c - 1
で
int
に変換し、その結果を
int8_t
. での引き算は
int
の引き算はオーバーフローせず、範囲外の積分値を別の積分型に変換することは有効です。変換先の型が符号付きの場合、結果は実装で定義されますが、変換先の型に対して有効な値である必要があります。(そして、宛先の型が符号なしであれば、結果はよく定義されていますが、それはここでは適用されません)。
関連
-
[解決済み】構造体のベクター初期化について
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み] GCCで「文字列定数から'char*'`への非推奨の変換」という警告を消すにはどうしたらいいですか?
-
[解決済み] gccでC/C++のソースからアセンブラ出力を得るにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】C++の余分な資格エラー
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件