Gio*_*nJh 5 c character-encoding
字符常量int在C中有类型.
现在假设我的机器的本地字符集是Windows Latin-1(http://www.ascii-code.com/),这是一个256字符集,所以每个char单引号之间,如'x',映射到int0到255之间的值右?
假设平原char是signed我的机器上,并考虑下面的代码:
char ch = 'â'
if(ch == 'â')
{
printf("ok");
}
Run Code Online (Sandbox Code Playgroud)
由于整数提升ch将被提升为负数量类型int(因为它具有前导零)并且被â映射到正数量ok将不会被打印.
但我确定我错过了什么,你能帮忙吗?
实际上,最初的分配不会按预期进行:
\n\nchar ch = '\xc3\xa2';\nRun Code Online (Sandbox Code Playgroud)\n\n这里有一个溢出,gcc 会对此发出警告。从技术上讲,这是未定义的行为,尽管对于非常常见的单字节char类型,该行为是足够可预测的——这是一个简单的整数溢出。根据您的默认字符集,这是一个多字节字符;如果我在我的机器上将其打印为整数,我会得到十进制 50082。
此外,比较是无效的,同样是因为char太小而无法容纳正在比较的值,并且再次,好的编译器会对此发出警告。
ISO C 定义了wchar_t,一种足够宽的类型,可以容纳扩展(即非 ASCII)字符,以及许多库函数的宽字符版本。必须处理非 ASCII 文本的代码当然应该使用这种宽字符类型。