以下实现定义为
char *cp = "\x96\xA0\xB4\xBE\xC8";
以及:
std::string = "\x96\xA0\xB4\xBE\xC8";
在我的编译器上,char
的意思是signed char
(MSVC 2015)。
我认为我无法执行以下操作:
unsigned char *cp = "\x96\xA0\xB4\xBE\xC8";
"\x96\xA0\xB4\xBE\xC8"
是0到255范围内的字节,因此我的问题是:
以上内容是否取决于编译器?
答案 0 :(得分:2)
以下实现定义为
signed char *cp = "\x96\xA0\xB4\xBE\xC8";
以及:
std::string = "\x96\xA0\xB4\xBE\xC8";
在具有8位宽的签名char
的系统上,可以。如果窄字符串文字中的十六进制转义序列超出为char
定义的实现定义的范围,则它具有实现定义的值。假设8位带符号的char
,则任何大于7F
的十六进制值都超出可表示的值范围。
在此方面,该文字是用于初始化std::string
还是指向字符的指针都是无关紧要的。
您可以使用unsigned char
数组代替字符串文字:
static constexpr unsigned char cp[] = {
0x96,
0xA0,
0xB4,
0xC8,
};
如果需要,可以使用此数组初始化std::basic_string<unsigned char>
:
std::basic_string<unsigned char> s = {std::begin(cp), std::end(cp)};
P.S。从字符串文字到非const char指针的转换格式不正确(自C ++ 11起;转换之前格式正确,但已弃用)。
P.P.S char
,unsigned char
和signed char
始终是三种不同的类型,无论char
是否已签名。