字符常量在C中的类型为int。
现在假设我的机器的本地字符集是Windows拉丁文-1( http://www.ascii-code.com/),这是一个256个字符集,所以单引号之间的每个char,比如'x',都映射到一个介于0和255之间的int值,对吗?
假设我的机器上的普通char是signed,并考虑以下代码:
char ch = 'â'
if(ch == 'â')
{
printf("ok");
}由于整数提升,ch将被提升为int类型的负数(因为它具有前导零),并且â映射到正数ok将不会被打印出来。
但我肯定我漏掉了什么你能帮上忙吗?
发布于 2012-07-27 22:11:19
实际上,初始赋值不会像预期的那样工作:
char ch = 'â';这里有一个溢出,gcc会对此发出警告。从技术上讲,这是未定义的行为,尽管对于非常常见的单字节char类型,行为是足够可预测的--它只是一个简单的整数溢出。根据您的默认字符集,这是一个多字节字符;如果在我的机器上将其打印为整数,我会得到十进制50082。
此外,比较是无效的,同样是因为char太小,无法保存被比较的值,而且好的编译器也会对此发出警告。
ISO定义了wchar_t,一种宽度足以容纳扩展(即非ASCII)字符的类型,以及许多库函数的宽字符版本。必须处理非ASCII文本的代码理所当然应该使用这种宽字符类型。
发布于 2012-07-27 22:12:23
您的C实现有一个执行字符集的概念。例如,在GCC中,您可以在命令行上调整这些参数。这两个设置的组合决定了分配给文字â的整数值。
发布于 2012-07-27 22:34:48
在对char进行签名的情况下:
在处理char ch = 'â'时,编译器将?转换为0xFFFFFFE2,并将0xE2存储在ch中。没有溢出,因为值是有符号的。
在处理if(ch == 'â')时,编译器将ch (0xE2)扩展为整数(0xFFFFFFFE2),并将其与‘-’(0xFFFFFFFE2)进行比较,因此条件将为真。
https://stackoverflow.com/questions/11689357
复制相似问题