字符类型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同样)进行比较,因此条件成立。

链接地址: http://www.djcxy.com/p/68387.html

上一篇: character type int

下一篇: Excel to CSV with UTF8 encoding