首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字符类型int

字符类型int
EN

Stack Overflow用户
提问于 2012-07-27 22:01:20
回答 3查看 636关注 0票数 5

字符常量在C中的类型为int

现在假设我的机器的本地字符集是Windows拉丁文-1( http://www.ascii-code.com/),这是一个256个字符集,所以单引号之间的每个char,比如'x',都映射到一个介于0和255之间的int值,对吗?

假设我的机器上的普通charsigned,并考虑以下代码:

代码语言:javascript
复制
char ch = 'â'

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

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

但我肯定我漏掉了什么你能帮上忙吗?

EN

回答 3

Stack Overflow用户

发布于 2012-07-27 22:11:19

实际上,初始赋值不会像预期的那样工作:

代码语言:javascript
复制
char ch = 'â';

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

此外,比较是无效的,同样是因为char太小,无法保存被比较的值,而且好的编译器也会对此发出警告。

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

票数 1
EN

Stack Overflow用户

发布于 2012-07-27 22:12:23

您的C实现有一个执行字符集的概念。例如,在GCC中,您可以在命令行上调整这些参数。这两个设置的组合决定了分配给文字â的整数值。

票数 1
EN

Stack Overflow用户

发布于 2012-07-27 22:34:48

在对char进行签名的情况下:

在处理char ch = 'â'时,编译器将?转换为0xFFFFFFE2,并将0xE2存储在ch中。没有溢出,因为值是有符号的。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11689357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档