は一般的に言えば、一定の文字の配列を初期化する2つの方法がある:(1)初期化文字の初期化子リストここ
const char bytes1[] = { 'A', 65, 0x41, 0101, 0 }; // results in a zero terminated string "AAAA"
値と、各値は異なるコード表現における単一文字の値であります。
(2)必要に応じて括弧で囲むことができ、文字列リテラル
const char bytes2[] = "AAAA";
const char bytes3[] = { "AAAA" };
で初期化するそれらの二つは、同じゼロで終わる文字列の両方の結果同等です。ただし、{ "AAAA" }
の構文が有効であっても、コンマやその他の値を組み合わせても有効であるとは限りません。
質問には2番目のトピックがあります。文字シーケンス/文字列リテラル内の16進値。以上から分かるように、'A'
は
は、次のように(
bytes1
を覚えている)、これは見ることができる単一の文字値を利用し...アスキーの小数点
65
として表現することができ、65は10進数、8進数、16進数、提示することができます。
文字列リテラルへの直接翻訳に問題があります
const char bytes7[] = { '\x41', 'A', '\101', 'A', 0 };
:
// The following is INVALID
const char bytes8[] = "\x41A\101A";
文字列リテラルと同じように書くには、直接的には不可能である"\x41A"
で、番目の理由e A
は、16進数の後に続く別の文字ではなく、16進シーケンスの一部と見なされます。結果の値は文字型の範囲外です。これは、文字列リテラルの連結によって解決することができます。"\x41" "A"
- 間に空白以外の文字を入れずに、2つのリテラルだけが隣り合っています。
// The following is VALID
const char bytes9[] = "\x41" "A\101A";
だから、同じ原理が、あなたの場合にも適用することができます:進シーケンスで
// VALID
const unsigned char BYTES[] = { "\x02" "FFFEU\x0C" "FFFFFFFF" };
大手0
が本当に必要と括弧もオプションである、上記の言ったようにではありません。
これらの初期化は、とにかく等価ではありません。 –
'const unsigned char BYTES [] =" \ 002FFFEU \ 014FFFFFFFF ";'を使用してください。違いはなく、どちらも間違っています。 –
具体的には、 '' FFFEU''は 'char'ではなく、' char'へのポインタです –