字符类型int
一个字符常量在C中有int
类型
现在假设我的机器的本地字符集是Windows Latin-1(http://www.ascii-code.com/),它是一个256个字符集,因此单引号之间的每个char
(如'x'
)映射为一个int
值在0到255之间吧?
假设在我的机器上signed
了简单char
并考虑以下代码:
char ch = 'â'
if(ch == 'â')
{
printf("ok");
}
由于整数促进ch
将被提升到型负量int
(导致它有一个前导零)并且被â
映射到正的量ok
将不被打印。
但我确定我错过了一些东西,你能帮忙吗?
你的C实现有一个执行字符集的概念。 而且,如果你的程序源代码是从文件中读取的(就像它总是这样),编译器有(或者应该有)一个源字符集的概念。 例如,在GCC中,您可以在命令行上调整这些参数。 这两项设置的组合确定分配给你的文字积分值â
。
实际上,初始任务不会按预期工作:
char ch = 'â';
这里溢出了,gcc会警告它。 从技术上讲,这是未定义的行为,尽管对于非常常见的单字节char
类型,行为足够可预测 - 这是一个简单的整数溢出。 根据您的默认字符集,这是一个多字节字符; 如果我在我的机器上以整数形式打印它,我会得到小数点50082。
而且,比较是无效的,同样因为char
太小而无法保存所比较的值,并且一个好的编译器会再次发出警告。
ISO C定义了wchar_t
,它是一种足够容纳扩展(即非ASCII)字符的类型,以及许多库函数的宽字符版本。 必须处理非ASCII文本的代码当然应该使用这种宽字符类型。
在char
被签名的情况下:
当处理char ch = 'â'
,编译器会将â转换为0xFFFFFFE2,并将ch储存0xE2。 没有溢出,因为值被签名。
当处理if(ch == 'â')
,编译器会将ch(0xE2)扩展为整数(0xFFFFFFE2),并将其与'â'(0xFFFFFFE2同样)进行比较,因此条件成立。
上一篇: character type int