1729214868
2024-10-17 22:21:00
1. 理論的根拠
C は 実装で定義されたバイト内のビット数を含むマクロ。この数値の値に制限はありません。 C++ はこのマクロをそのままインポートします。他の多くのマクロやキャラクター特性には、以下から派生した値があります。 。これはコンピューティングの初期には歴史的に関連していましたが、現代のハードウェアは圧倒的に 1 バイトが 8 ビットであるという前提に収束しています。この文書は、C++ が 1 バイトが 8 ビットであることを正式に義務付けることを提案しています。
主流のコンパイラはすでにこの現実をサポートしています。
GCC が削除されたなど、痕跡的なサポートが見つかります。 2004 年の dsp16xx、 そして 1750a、2002年。検索 さらなる証拠についてはウェブで 最新の C++ には関係がないと思われる、GCC のツリー外ポートがいくつか見つかります。
[POSIX] POSIX.1-2001 (または IEEE Std 1003.1-2001) 以来、この現実を義務化しており、次のように述べています。
追加した結果として、
、次のことが当てはまります。int8_t
1 バイトは正確に 8 ビットです。
値は 8 で、CHAR_BIT 値は 127 で、SCHAR_MAX 値は -128 であり、SCHAR_MIN 値は 255 です。UCHAR_MAX POSIX.1 標準では 2 の補数演算による 8 ビット char が明示的に必要とされるため、同じ 2 の補数保証が他のすべての標準整数型に拡張されると、アプリケーション作成者にとっては容易になります。さらに、32 ビット長のプログラミング環境では、次のような一部の POSIX.1 インターフェイスが使用されます。
、long が 2 の補数表現を使用しない場合は実装できません。mrand48 ()
2001 年に POSIX が選択した現実にさらに付け加えると、C++20 はそれ以来 2 の補数ストレージのみをサポートしています。 [P0907r4]、C23もこれに追随しました。
ハードウェアおよびソフトウェア プラットフォームにおける 8 ビット バイトの圧倒的なサポートは、非 8 ビット バイト用に書かれたソフトウェアは 8 ビット バイト用に書かれたソフトウェアと互換性がなく、またその逆も同様であることを意味します。非 8 ビット バイトをターゲットとする C および C++ コードは、C と C++ の互換性のない方言です。
ウィキペディアの引用 以下のオペレーティング システムは現在 POSIX に準拠しています (したがって 8 ビット バイトをサポートしています)。
-
AIX
-
HP-UX
-
誠実さ
-
macOS
-
オープンサーバー
-
UnixWare
-
VxWorks
-
vz/OS
また、以前は準拠していたか、またはほぼ準拠していると考えられる他の多くの企業もいます。
AI 以前の私たちの最良の知識 (Wikipedia 以降) のリポジトリである StackOverflow でさえ、 非 8 ビット バイト アーキテクチャに対する熱意があふれていると尋ねます。 委員会が注目するエキゾチックな建築はどれですか。
なぜわざわざ?理由はいくつかあります:
-
非 8 ビット バイト アーキテクチャをサポートする複雑さにより、言語とライブラリのかなりの部分に小さいながらも不必要な負荷がかかります。
-
コンパイラーとツールチェーンは、最新の使用法を反映していないエッジケースをサポートする必要があります。
-
新しいプログラマは混乱しやすく、C++ のエキゾチックな味を鈍感に感じます。
-
経験豊富なプログラマの中には、賢明でない場合には、「移植性を高めるために」存在しないプラットフォームのサポートに喜んで時間を費やす人もいます。
-
私たちの言語は愚かに見える、誰も抱えていない問題を解決します。
気にしない理由の 1 つは、8 ビット以外のバイトを使用するプロセッサがまだ存在することです。私たちが直面している疑問は、それらは最新の C++ に関連しているのかということです。 Bytes”R”Us を使用する現在のアプローチをサポートし続ける場合、これらのプロセッサを使用する開発者は C++ の新しいバージョンを使用することになりますか?
赤ちゃんを半分に切る代替策は、次のことを義務付けることです。 。それで何かが良くなったでしょうか?委員会がデジタル シグナル プロセッサ (DSP) およびその他のプロセッサのサポートを継続すると決定した場合のみ、 ではありません しかし、それはの倍数です 。
この文書は、PDP-10 (ただし、PDP-11 には 8 ビット バイトがあることに注意) と、一部の DSP では 24 ビットまたは 32 ビット ワードが「バイト」として扱われるという事実について言及せずに終えることはできません。これらのアーキテクチャは、ワード サイズがさまざまでバイトの概念が標準化されていなかった時代には意味がありました。現在、ほぼすべての汎用システムおよび組み込みシステムが 8 ビット バイト モデルに準拠しています。問題は、バイトが 8 ビットではないアーキテクチャがまだ存在するかどうか (実際には存在します!) ではなく、それらが最新の C++ を考慮しているかどうか、そして最新の C++ がそれらを考慮しているかどうかです。
2. C への影響
この提案では、バイトが 8 ビットではないアーキテクチャに C++ が関連するかどうか、またこれらのアーキテクチャが C++ に関連するかどうかを検討します。 C 委員会は、この言語に関して異なる結論に達する可能性があります。理想的には、両方の委員会が連携することです。したがって、この文書は WG14 と SG22 連絡グループに委ねられ、WG21 に通知されます。
3. 言葉遣い
3.1. 言語
編集 [intro.memory] 次のように:
++ メモリ モデルの基本的な記憶単位はバイトです。バイトは少なくとも、基本文字セット リテラル文字セットの任意の要素の通常のリテラル エンコーディングと Unicode UTF-8 UTF-8 エンコーディング形式の 8 ビット コード単位を含むのに十分な大きさであり、次の連続シーケンスで構成されます。ビット。その数はバイト内のビットです。最下位ビットは下位ビットと呼ばれます。最上位ビットは上位ビットと呼ばれます。 C++ プログラムで使用できるメモリは、1 つ以上の連続したバイトのシーケンスで構成されます。すべてのバイトには一意のアドレスがあります。
バイト内のビット数はマクロによって報告されます。
ヘッダーにあるCHAR_BIT 。climits
3.2. 図書館
編集 [climits.syn] 次のように:
// all freestanding #define CHAR_BIT see below #define SCHAR_MIN see below #define SCHAR_MAX see below #define UCHAR_MAX see below #define CHAR_MIN see below #define CHAR_MAX see below #define MB_LEN_MAX see below #define SHRT_MIN see below #define SHRT_MAX see below #define USHRT_MAX see below #define INT_MIN see below #define INT_MAX see below #define UINT_MAX see below #define LONG_MIN see below #define LONG_MAX see below #define ULONG_MAX see below #define LLONG_MIN see below #define LLONG_MAX see below #define ULLONG_MAX see below ヘッダー
すべてのマクロを C 標準ライブラリのヘッダーと同じように定義しますclimits limits . h 。
を除いて
そしてCHAR_BIT 、整数型を参照するマクロMB_LEN_MAX 型がプロモートされた型である定数を定義しますT 。T
編集 [cstdint.syn] 次のように:
ヘッダー
指定された幅を持つ整数型と、整数型の制限を指定するマクロを提供します。cstdint int8_t int16_t int32_t int64_t int_fast8_t int_fast16_t int_fast32_t int_fast64_t int_least8_t int_least16_t int_least32_t int_least64_t intmax_t intptr_t uint8_t uint16_t uint32_t uint64_t uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t uint_least8_t uint_least16_t uint_least32_t uint_least64_t uintmax_t uintptr_t // all freestanding namespace std { using int8_t = signed integer type ; // optional using int16_t = signed integer type ; // optional using int32_t = signed integer type ; // optional using int64_t = signed integer type ; // optional using int N _t = see below ; // optional using int_fast8_t = signed integer type ; using int_fast16_t = signed integer type ; using int_fast32_t = signed integer type ; using int_fast64_t = signed integer type ; using int_fast N _t = see below ; // optional using int_least8_t = signed integer type ; using int_least16_t = signed integer type ; using int_least32_t = signed integer type ; using int_least64_t = signed integer type ; using int_least N _t = see below ; // optional using intmax_t = signed integer type ; using intptr_t = signed integer type ; // optional using uint8_t = unsigned integer type ; // optional using uint16_t = unsigned integer type ; // optional using uint32_t = unsigned integer type ; // optional using uint64_t = unsigned integer type ; // optional using uint N _t = see below ; // optional using uint_fast8_t = unsigned integer type ; using uint_fast16_t = unsigned integer type ; using uint_fast32_t = unsigned integer type ; using uint_fast64_t = unsigned integer type ; using uint_fast N _t = see below ; // optional using uint_least8_t = unsigned integer type ; using uint_least16_t = unsigned integer type ; using uint_least32_t = unsigned integer type ; using uint_least64_t = unsigned integer type ; using uint_least N _t = see below ; // optional using uintmax_t = unsigned integer type ; using uintptr_t = unsigned integer type ; // optional } #define INT N _MIN see below #define INT N _MAX see below #define UINT N _MAX see below #define INT_FAST N _MIN see below #define INT_FAST N _MAX see below #define UINT_FAST N _MAX see below #define INT_LEAST N _MIN see below #define INT_LEAST N _MAX see below #define UINT_LEAST N _MAX see below #define INTMAX_MIN see below #define INTMAX_MAX see below #define UINTMAX_MAX see below #define INTPTR_MIN see below // optional #define INTPTR_MAX see below // optional #define UINTPTR_MAX see below // optional #define PTRDIFF_MIN see below #define PTRDIFF_MAX see below #define SIZE_MAX see below #define SIG_ATOMIC_MIN see below #define SIG_ATOMIC_MAX see below #define WCHAR_MIN see below #define WCHAR_MAX see below #define WINT_MIN see below #define WINT_MAX see below #define INT N _C(value) see below #define UINT N _C(value) see below #define INTMAX_C(value) see below #define UINTMAX_C(value) see below ヘッダーは、C 標準ライブラリのヘッダー stdint.h と同じように、すべての型とマクロを定義します。
プレースホルダーを使用するすべての型 N の場合はオプションです N ではありません
、8 、16 、 または32 。64
正確な幅のタイプそしてint N _t のために N =uint N _t 、8 、16 、 そして32 もオプションです。ただし、実装が対応する幅を持ちパディング ビットを持たない整数型を定義する場合は、対応する typedef-name が定義されます。この副節にリストされている各マクロは、実装が対応する typedef-name を定義する場合にのみ定義されます。64 マクロ
そしてINT N _C typedef-name に対応しますUINT N _C そしてint_least N _t 、 それぞれ。uint_least N _t
内で [localization]、4を削除します。 義務づける 以下を指定する句:
はCHAR_BIT == 8 true
#バイトにはちょうど #ビットがあります