5

字符常量int在 C 中具有类型。

现在假设我的机器的本地字符集是 Windows Latin-1 ( http://www.ascii-code.com/ ),它是一个 256 个字符集,因此char单引号之间的每个,比如'x',都映射到int0 到 255 之间的值。 ?

假设 plaincharsigned我的机器上并考虑以下代码:

char ch = 'â'

if(ch == 'â')  
{
    printf("ok");
}

由于整数提升ch将被提升为类型的负数int(因为它有前导零)并且â映射到正数ok不会被打印。

但我确定我错过了一些东西,你能帮忙吗?

4

3 回答 3

1

实际上,初始分配不会按预期工作:

char ch = 'â';

这里有一个溢出,gcc 会警告它。从技术上讲,这是未定义的行为,尽管对于非常常见的单字节char类型,行为是可以预测的——它是一个简单的整数溢出。根据您的默认字符集,这是一个多字节字符;如果我在我的机器上将它打印为整数,我会得到十进制 50082。

此外,比较是无效的,同样char是因为太小而无法容纳被比较的值,而且好的编译器会再次警告它。

ISO C 定义wchar_t了一个足以容纳扩展(即非 ASCII)字符的类型,以及许多库函数的宽字符版本。必须处理非 ASCII 文本的代码当然应该使用这种宽字符类型。

于 2012-07-27T14:11:18.610 回答
1

您的 C 实现具有执行字符集的概念。此外,如果您的程序源代码是从文件中读取的(一如既往),编译器具有(或应该具有)源字符集的概念。例如,在 GCC 中,您可以在命令行上调整这些参数。这两个设置的组合决定了分配给您的文字的整数值 â

于 2012-07-27T14:12:22.650 回答
0

char在签署的情况下:

处理char ch = 'â'时,编译器会将â转换为0xFFFFFFE2,并将0xE2存入ch。没有溢出,因为该值已签名。

在处理if(ch == 'â')时,编译器会将 ch (0xE2) 扩展为整数 (0xFFFFFFE2) 并将其与 'â' (0xFFFFFFE2 也是) 进行比较,因此条件为真。

于 2012-07-27T14:34:47.690 回答