-
char
型のデフォルトはcharacterですか?int
どうですか? -
(signed char *)
への暗黙的なキャストは(char *)
ですか? そして、int
についても同じですか? -
unsigned char
は何ビットありますか? -
int
配置されることが保証されている最大数はいくつですか? そして最低限? -
long
型は間違いなくchar
よりも大きいですよね?
もちろん、お気に入りのコンピューターのお気に入りのシステムでお気に入りのコンパイラーを使用してこれらの質問に対する答えを実験的に探すことは、良い考えではありません。 言語標準(C99以降)について話している。
これらの質問に自信を持って正しく回答できる場合は、この記事は役に立ちません。 そうでなければ、それを読むのに10分を費やすことは非常に便利です。
私はあなたが答えたと仮定します
- 両方とも重要です。
- 両方とも合法です。
- 8。
- 2147483647. -214748364 8 。
- もちろん、キャップ。
そして、正しい答えは
-
char
規制なし、int
署名済み。 -
int
場合は正当ですが、char
場合はそうではありません。 - 少なくとも8。
- 32767。-32767
- 一般的に言えば、いいえ。
signed
およびunsigned
について
char
を除くすべての整数型
char
、デフォルトで符号付きです。
char
状況はより複雑です。 標準で
signed char
、
char
、
signed char
、
unsigned char
3つの異なるタイプが確立されています。 特に、タイプ
(signed char *)
ポインターを暗黙的にタイプ
(char *)
キャストすることはできません。
正式にはこれらは3つの異なるタイプですが、実際には
char
signed char
または
unsigned char
いずれか
char
同等です-コンパイラの選択(標準は特定のものを必要としません)。
コメントに
char
詳細を書きました。
unsigned char
サイズについて
unsigned char
型は、マシンバイトの抽象化です。 このタイプの重要性は、Cがメモリを最も近いバイトにしかアドレス指定できないことです。 ほとんどのアーキテクチャでは、バイトサイズは8ビットですが、例外があります。 たとえば、36ビットアーキテクチャのプロセッサには通常9ビットのバイトがあり、一部のTexas Instruments DSPでは、バイトは16ビットまたは32ビットで構成されています。 古代のアーキテクチャには、4、5、または7ビットの短いバイトがあります。
標準Cは、古いアーキテクチャを放棄せざるを得ず、少なくとも 8ビットのバイトが必要です。 このプラットフォームの特定の値(
CHAR_BIT
2) )は、ヘッダーファイル
limits.h
記録されます。
Cの整数型のサイズ
Cは移植性があるため、基本的な整数型(
char
、
short
、
int
など)のサイズは厳密には設定されていませんが、プラットフォームによって異なります。 ただし、これらのタイプは移植性がない
それらのサイズは完全に任意でした。標準は、すべての基本的な整数型に対して受け入れられる値の最小範囲を確立します。 すなわち
-
signed char:
-127 ... 127(-128 ... 127ではなく、同様に他のタイプ) -
unsigned char
:0 ... 255(= 2 8 -1) -
signed short
:-32767 ... 32767 -
unsigned short
:0 ... 65535(= 2 16 -1) -
signed int
:-32767 ... 32767 -
unsigned int
:0 ... 65535(= 2 16 -1) -
signed long
:-2147483647 ... 2147483647 -
unsigned long
:0 ... 4294967295(= 2 32 −1) -
signed long long
:-9223372036854775807 ... 9223372036854775807 -
unsigned long long
:0 ... 18446744073709551615(= 2 64 -1)
標準では、
unsigned char
最大値は2 CHAR_BIT -1であることが必要です(前の段落を参照)。
標準では、
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
です。 したがって、
sizeof(char)=sizeof(long)=32
というタイプの状況は非常に正当です。 テキサス・インスツルメンツのDSPの一部はそうです。
このプラットフォームのこれらの範囲の特定の値は、ヘッダーファイル
limits.h
指定されています。
C99の新しいタイプ
C99が
long long
型を追加した後、整数型と混乱はさらに大きくなりました。 整理するために、標準では、ヘッダーファイル
stdint.h
導入しました。これは、
int16_t
(16ビットに等しい)、
int_least16_t
(16ビットに対応できる最小タイプ)、
int_fast16_t
(少なくとも16ビット、プラットフォーム)など
最小タイプと高速タイプは、実際には、上記で説明した
int
、
short
、
long
などのタイプの置換であり、さらにプログラマーに速度とサイズの選択を与えるだけです。
厳密なサイズを示す
int16_t
ような型は、移植性に影響します。たとえば、9ビットバイトのアーキテクチャでは、16ビットのレジスタが単に見つからない場合があります。 したがって、ここの標準では、これらのタイプはオプションであると明確に述べています。 しかし、どんなコードを書いても、すべての場合よりも少ない場合、ターゲットアーキテクチャは、ファミリ(たとえばx86またはAVR)に正確な最悪の場合でも修正されます。その内部では、バイトサイズは突然変更できず、移植性は実際に保持されます。 さらに、
int16_t
ような型は、
int_least16_t
や
int_fast16_t
よりも人気があり、低レベルのプログラミング(マイクロコントローラー、デバイスドライバー)でさえ、変数サイズの不確実性は単に許容できないためです。
1)便宜上、上位3つのアーキテクチャ+ OS +コンパイラは単にプラットフォームと呼ばれます 。
2)このマクロは
UCHAR_BIT
を呼び出す
UCHAR_BIT
が
UCHAR_BIT
適切ですが、互換性の理由から、それは呼ばれているものと呼ばれます。