2017-12-13 6 views
4

私はバイト配列を使用する小さなネットワーキングアプリケーションに取り組んでいます。伝統的には、これらは、char buf[] = ...のようなもので宣言されます。C:uint8_tとしてバイト配列を宣言すると何か問題はありますか?

これはほとんどのチュートリアルでやっているようですが、実際に何が起こっているのかがわからなくなることがあります。たとえば、このような配列を印刷しようとすると、可視文字です。

一部の人have suggestedcharsの使用をやめて、代わりに最新のuint8_tを使用してください。私はそれが非常に魅力的で、主に明示的が暗黙的よりも優れているという原則に基づいています。

したがって、これらの種類の配列をuint8_t buf[] = ...と宣言すると何か問題がありますか?

+1

私にとっては、どちらも間違っているとは思われません。 charはすべてのプラットフォームで8ビット(1バイト)として 'uint8_t'と定義されています。 unまたはsignedの唯一の違い/問題は、キャストまたはintへの変換時の符号拡張です。 –

+1

@PaulOgilvie - ( 'char'は8ビットです)保証されていません。圧倒的に一般的ですが、保証されていません。 –

+0

charが8ビット(感謝@OliverCharlesworth)である場合、charが必要な場合はcharを使用し、バイトがrequriedの場合はuint8_tを使用する必要があります(後者はネットワークインターフェイスで、前者は例えば文字処理です)。 –

答えて

3

stdint.hヘッダーがC99に導入されてから、charタイプを使用して小さな番号を表す理由はありません。

uint8_tは、あなたの意向をより良く記録することに加えて、もう1つの重要な利点をもたらします。つまり、バイトが符号なしとして扱われることを保証します。 charを使用すると、署名または署名されていないと想定できません。この動作は実装定義であるためです。多くのプラットフォーム上で、それは単にunsigned charためtypedefだから

限りバッファの不注意による印刷が進むにつれて、uint8_tを使用すると、任意の保護を保証するつもりはありません。

+1

'uint8_t'は、文字型のtypedefではないかもしれないので、他の型のエイリアシングには使用できないという理論上の問題があります...将来的には –

関連する問題