热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

c语言char类型的相关知识点

过去在使用char类型时,只是单纯的将它理解为一个字符类型,最近写的一些代码里因为用到了char类型存整数,并涉及char型和int型的强制转化,所以将相关知识点一并总结如下。1.char类

过去在使用char类型时,只是单纯的将它理解为一个字符类型,最近写的一些代码里因为用到了char类型存整数,并涉及char型和int型的强制转化,所以将相关知识点一并总结如下。

1.char类型的本质其实就是开辟了一个字节的空间存储数字,当使用%d时输出数字,使用%c时输出ASCII对应的字符。

2.char默认为signed char类型,最大位为符号位,范围是-128到127.用补码的方式存储,-128存储为1000 0000(相当于将 -0设置为-128,多存一个数)。

3.将int型强转为char型时,直接截取低八位;char型强转int型时,保留char的值,然后高位补全(注意,如果char存负数,因为是补码,补0补1的问题)。

4.程序里面的字符常量是按int处理的,sizeof('A')与sizeof(65)等效;编译器, 对纯数字预设以int处理. 所以, 你直接印出'A', 'a'的大小, 会是int大小. 因为已经被转换成数字才真的编译。而sizeof('字符变量') 为1。


以下是一个相关代码测试:

#include 
int main()
{
char a = 254;  
printf("10进制形式:a=%d,254=%d\n",a,254);
printf("16进制形式:a=%x,254=%x\n",a,254);
int  b = (int)a; 
int  c = (int)(a&0xFF);
printf("10进制形式:b=%d,c=%d\n",b,c);
printf("16进制形式:b=%x,c=%x\n",b,c);
return 0;
}
在VS2008(32位编译器)编译运行后结果如下:
10进制形式:a=-2,254=254  //补码存储
16进制形式:a=fffffffe,254=fe 

/* 1、默认参数提升:如果一个函数的形参类型未知,那么调用函数时要对相应的实参做“整数提升(integer promotions)”,除此以外,float类型的参数会被提升为double。
printf符合1,因为它是形参类型未知 int printf(const char *,...)。所以char or unsigned char会做类型提升,提升为int,提升这个操作才涉及到符号扩展的原则。*/


10进制形式:b=-2,c=254 //b=-2符号位补全,c=254注意都是补码进行运算
16进制形式:b=fffffffe,c=fe

Point:16进制的输出我们可以看到运算的本质。(a&0xFF)时,因为0xFF默认是int型,所以要进行整型提升,a默认提升到int型进行按位与运算,得到结果0x000000fe

实验可以证明:int c = (unsigned char)0xfe  、int c = 0xfe、int  c = (int)(a&0xFF)结果是一样的,都为0x000000fe;
若按位与两操作数都为char,结果自然依旧为char
实验可以证明 int c = (char)0xfe 、int  c = (int)(a&(char)0xFF)结果一样,都为0xfffffffe;


注:关于整型提升(integral promotion)

K&R C中关于整型提升(integral promotion)的定义为:

"A character, a short integer, or an integer bit-field, all either signed or not, or an object of enumeration type, may be used in an expression wherever an integer maybe used. If an int can represent all the values of the original type, then the value is converted to int; otherwise the value is converted to unsigned int. This process is called integral promotion."

我理解为:char、short int、活整型位域(这几者带符号或无符号均可)的变量,以及枚举类型的对象;在进行表达式运算时,都会默认转为int(或unsigned int型)进行运算

例如:char a , b ,c;
           c=a + b;

           printf ( " the size of the result of a+b :%d " ,sizeof( a+b) ); //输出为4

           包括两个char位运算,也是先转成int型在进行运算。


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
author-avatar
相思和怀恋_811_372
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有