17

私は utf8 を使用しており、char 配列に定数を保存する必要があります。

const char s[] = {0xE2,0x82,0xAC, 0}; //the euro sign

ただし、エラーが発生します:

test.cpp:15:40: error: narrowing conversion of ‘226’ from ‘int’ to ‘const char’ inside { } [-fpermissive]

すべての 16 進数を char にキャストする必要がありますが、これは面倒で、いい匂いがしません。これを行う他の適切な方法はありますか?

4

4 に答える 4

32

charsignedorの場合がありunsignedます (デフォルトは実装固有です)。あなたはおそらくしたいです

  const unsigned char s[] = {0xE2,0x82,0xAC, 0}; 

また

  const char s[] = "\xe2\x82\xac";

または最近の多くのコンパイラ ( GCCを含む)

  const char s[] = "€";

(文字列リテラルcharは、プレフィックスを付けない限りの配列です)

GCC の-funsigned-char (または-fsigned-char) オプションを参照してください。

一部の実装でcharunsigned、 a はCHAR_MAX255 (かつCHAR_MIN0) です。他のchar-sは -128 であり、signed127です (たとえば、Linux/PowerPC/32 ビットと Linux/x86/32 ビットでは状況が異なります)。私の知る限り、標準では19ビットの符号付き文字を禁止しているものはありません。CHAR_MINCHAR_MAX

于 2013-10-31T19:53:30.447 に答える
0

あなたの質問に対する簡単な答えは、あなたがオーバーフローしているということですchar。Acharの範囲は [-128, 127] です。0xE2 = 226 > 127. 使用する必要があるのunsigned charは、[0, 255] の範囲を持つ です。

unsigned char s = {0xE2,0x82,0xAC, 0};
于 2013-10-31T20:06:59.220 に答える