15

この回答と添付のコメントで、Pavel Minaevuint8_tは、C ではtypedef できる唯一の型はcharandであるという次の引数を作成しますunsigned char。私はC標準のこのドラフトを見ています。

  • の存在uint8_tは、対応する型int8_t(7.18.1p1) の存在を意味します。
  • int8_t幅は 8 ビットで、パディング ビットはありません (7.18.1.1p1)。
  • 対応する型は同じ幅 (6.2.5p6) であるため、uint8_t8 ビット幅でもあります。
  • unsigned charビット幅ですCHAR_BIT(5.2.4.2.1p2 および 6.2.6.1p3)。
  • CHAR_BIT少なくとも 8 (5.2.4.2.1p1) です。
  • CHAR_BITuint8_tが であるかunsigned char、幅が(6.2.6.1p4)unsigned charの倍数である非ビットフィールド型であるため、最大 8です。CHAR_BIT

この議論に基づいて、uint8_t存在する場合、それと両方unsigned charが同じ表現を持つことに同意します。8つの値ビットと0のパディングビットです。それはそれらを同じタイプにすることを強制していないようです(たとえば、6.2.5p14)。

uint8_tと同じ表現で拡張符号なし整数型 (6.2.5p6) に typedef されることは許可されunsigned charますか? unsigned char確かにそれは typedef (7.18.1.1p2) である必要があり、 (またはcharたまたま符号なしである場合)以外の標準の符号なし整数型にすることはできません。この架空の拡張型は文字型 (6.2.5p15) ではないため、互換性のない型 (6.5p7) のオブジェクトへのエイリアス アクセスの対象にはなりません。もの。

4

4 に答える 4

5

uint8_t存在する場合、パディングなしの要件はそれが 8 であることを意味します。ただし、拡張整数型で定義できなかっCHAR_BITた理由を見つけることができる根本的な理由はありません。さらに、表現が同じであるという保証はありません。たとえば、ビットは逆の順序で解釈される可能性があります。uint8_t

これは、 にとってはばかげて不当に珍しいように思えuint8_tますが、 にとっては非常に理にかなっている可能性がありint8_tます。マシンが 1 の補数または符号/大きさをネイティブに使用する場合、 は にsigned charは適していませんint8_t。ただし、2 の補数をエミュレートして を提供する拡張符号付き整数型を使用できますint8_t

于 2012-10-01T00:28:08.700 に答える
3

6.3.1.1 (1) (C11 規格の N1570 ドラフトの) では、次のように読むことができます。

標準整数型のランクは、同じ幅の拡張整数型のランクより大きくなければなりません。

したがって、標準では、標準の整数型と同じ幅の拡張整数型の存在が明示的に許可されています。

を禁止する規格はありません。

typedef implementation_defined_extended_8_bit-unsigned_integer_type uint8_t;

uint8_t私が見る限り、その拡張整数型が(パディングビットなし、幅8ビット)の仕様と一致する場合。

そうです、実装がそのような拡張整数型を提供する場合、それに型定義するuint8_t ことができます。

于 2012-10-01T00:28:33.260 に答える
-1

int8_t と uint8_t は REPRESENTATION のみが異なり、コンテンツ (ビット) は異なりません。int8_t は下位 7 ビットをデータに使用し、8 ビット目は「符号」(正または負) を表します。したがって、int8_t の範囲は -128 から +127 です (0 は正の値と見なされます)。

uint8_t も 8 ビット幅ですが、それに含まれるデータは常に正です。したがって、uint8_t の範囲は 0 から 255 です。

この事実を考慮すると、char は 8 ビット幅です。unsigned char も 8 ビット幅ですが、「符号」はありません。同様に、short と unsigned short はどちらも 16 ビット幅です。

ただし、" unsigned int" が 8 ビット幅の場合、.. C はタイプナチではないため、許可されます。そして、なぜコンパイラの作成者はそのようなことを許可するのでしょうか? 読みやすさ!

于 2012-10-01T00:07:07.413 に答える