日本語版
最新ニュース
科学&テクノロジー

1 バイトにはちょうど 8 ビットがあります

1. 理論的根拠 C は CHAR_BIT 実装で定義されたバイト内のビット数を含むマクロ。この数値の値に制限はありません。 C++ はこのマクロをそのままインポートします。他の多くのマクロやキャラクター特性には、以下から派生した値があります。 CHAR_BIT。これはコンピューティングの初期には歴史的に関連していましたが、現代のハードウェアは圧倒的に 1 バイトが 8 ビットであるという前提に収束しています。この文書は、C++ が 1 バイトが 8 ビットであることを正式に義務付けることを提案しています。 主流のコンパイラはすでにこの現実をサポートしています。 GCC が削除されたなど、痕跡的なサポートが見つかります。 2004 年の dsp16xx、 そして 1750a、2002年。検索 さらなる証拠についてはウェブで 最新の C++ には関係がないと思われる、GCC のツリー外ポートがいくつか見つかります。 [POSIX] POSIX.1-2001 (または IEEE Std 1003.1-2001) 以来、この現実を義務化しており、次のように述べています。…

1 バイトにはちょうど 8 ビットがあります

1729214868
2024-10-17 22:21:00

1. 理論的根拠

C は CHAR_BIT 実装で定義されたバイト内のビット数を含むマクロ。この数値の値に制限はありません。 C++ はこのマクロをそのままインポートします。他の多くのマクロやキャラクター特性には、以下から派生した値があります。 CHAR_BIT。これはコンピューティングの初期には歴史的に関連していましたが、現代のハードウェアは圧倒的に 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 ビットです。

  • CHAR_BIT 値は 8 で、 SCHAR_MAX 値は 127 で、 SCHAR_MIN 値は -128 であり、 UCHAR_MAX 値は 255 です。

POSIX.1 標準では 2 の補数演算による 8 ビット char が明示的に必要とされるため、同じ 2 の補数保証が他のすべての標準整数型に拡張されると、アプリケーション作成者にとっては容易になります。さらに、32 ビット長のプログラミング環境では、次のような一部の POSIX.1 インターフェイスが使用されます。 mrand48()、long が 2 の補数表現を使用しない場合は実装できません。

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++ の新しいバージョンを使用することになりますか?

赤ちゃんを半分に切る代替策は、次のことを義務付けることです。 CHAR_BIT % 8 == 0。それで何かが良くなったでしょうか?委員会がデジタル シグナル プロセッサ (DSP) およびその他のプロセッサのサポートを継続すると決定した場合のみ、 CHAR_BIT ではありません 8 しかし、それはの倍数です 8

この文書は、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

ヘッダー climits すべてのマクロを C 標準ライブラリのヘッダーと同じように定義します 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 intN_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_fastN_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_leastN_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 uintN_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_fastN_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_leastN_t  = see below;             // optional

  using uintmax_t      = unsigned integer type;
  using uintptr_t      = unsigned integer type; // optional
}

#define INTN_MIN         see below
#define INTN_MAX         see below
#define UINTN_MAX        see below

#define INT_FASTN_MIN    see below
#define INT_FASTN_MAX    see below
#define UINT_FASTN_MAX   see below

#define INT_LEASTN_MIN   see below
#define INT_LEASTN_MAX   see below
#define UINT_LEASTN_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 INTN_C(value)    see below
#define UINTN_C(value)   see below
#define INTMAX_C(value)  see below
#define UINTMAX_C(value) see below

ヘッダーは、C 標準ライブラリのヘッダー stdint.h と同じように、すべての型とマクロを定義します。

プレースホルダーを使用するすべての型 N の場合はオプションです N ではありません 81632、 または 64
正確な幅のタイプ intN_t そして uintN_t のために N = 81632、 そして 64 もオプションです。ただし、実装が対応する幅を持ちパディング ビットを持たない整数型を定義する場合は、対応する typedef-name が定義されます。この副節にリストされている各マクロは、実装が対応する typedef-name を定義する場合にのみ定義されます。

マクロ INTN_C そして UINTN_C typedef-name に対応します int_leastN_t そして uint_leastN_t、 それぞれ。

内で [localization]、4を削除します。 義務づける 以下を指定する句:

CHAR_BIT == 8true

#バイトにはちょうど #ビットがあります

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。