首页 文章

如何使用十六进制数初始化char数组?

提问于
浏览
9

我使用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]

我必须将所有十六进制数字转换为char,这让我觉得乏味且闻起来不太好 . 有没有其他正确的方法这样做?

3 回答

  • 0

    虽然在你的代码中加入大量的强制转换可能会很乏味,但实际上我觉得使用尽可能强大的键入效果非常好 .

    如上所述,当您指定类型“char”时,您正在邀请编译器选择编译器编写者首选的任何内容(有符号或无符号) . 我不是UTF-8的专家,但如果你不需要,我没有理由让你的代码不可移植 .

    至于你的常量,我使用的编译器默认常量写入签名的int,以及考虑上下文并相应地解释它们的编译器 . 请注意,有符号和无符号之间的转换可能会溢出EITHER WAY . 对于相同数量的位,负数溢出无符号(显然)和无符号,顶部位设置溢出有符号,因为最高位表示负数 .

    在这种情况下,您的编译器将您的常量视为无符号8位 - 或更大 - 这意味着它们不适合作为带符号的8位 . 我们都很感激编译器抱怨(至少我是) .

    我的观点是,铸造没有什么不好表明你打算发生什么 . 如果编译器允许您在有符号和无符号之间进行分配,则应该要求您在不考虑变量或常量的情况下进行转换 . 例如

    const int8_t a =(int8_t)0xFF; //将是-1

    虽然在我的例子中,分配-1会更好 . 当你不得不添加额外的强制转换时,它们要么有意义,要么你应该对你的常量进行编码,以便它们对你所分配的类型有意义 .

  • 0

    对你的问题的简短回答是,你正在溢出 char . char 的范围为[-128,127] . 0xE2 = 226> 127.您需要使用的是 unsigned char ,其范围为[0,255] .

    unsigned char s = {0xE2,0x82,0xAC, 0};
    
  • 17

    char 可能是 signedunsigned (默认值是特定于实现的) . 你可能想要

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

    要么

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

    string literalchar 的数组,除非你给它一些前缀)

    请参阅GCC的-funsigned-char(或 -fsigned-char )选项 .

    在某些实现中, charunsignedCHAR_MAX 是255( CHAR_MIN 是0) . 在其他 char -s是 signed 所以 CHAR_MIN 是-128和 CHAR_MAX 是127(例如在Linux / PowerPC / 32位和Linux / x86 / 32位上有所不同) . AFAIK标准中没有任何内容禁止19位签名字符 .

相关问题