96SEO 2026-02-20 04:51 25
字符类型字符被当做整数来操作转义序列大小写转换scanf和printf读/写字符getchar和putchar读写字符

类型转换类型转换的必要性发生隐式转换的情况常规算术转换赋值时的转换强制类型转换
6种整数类型如何确定整数类型的范围编译器如何确定整型常量的范围整数溢出时的行为读写整数的转换说明符浮点数的范围数字转义序列getchar的惯用法需要类型转换的原因会发生隐式转换发生的4个情况常规算数转换和赋值转换的规则强制类型转换的应用typedef的优点sizeof的2个注意事项
最左边带符号位的是有符号整数。
正数或0的符号位是0负数的符号位是1。
不带符号位的整数是无符号整数最左边的位也是数值的一部分。
无符号整数主要用于系统编程和底层与机器相关的应用。
C语言的整数默认都是有符号的。
如果要告诉编译器变量没有符号位需要把它声明为unsigned类型。
除了int外C语言还提供了长整型和短整型用来存储大数或存小数节省空间。
为了使构造的整数类型满足需要可以指明变量是long类型或short类型signed类型或unsigned类型。
也能把说明符组合起来产生以下6种不同的类型
为了满足对超大型整数的需求和适应64位的处理器C99提供了long
int0232-132位机类型最小值最大值:----:----::----:short
int0232-164位机类型最小值最大值:----:----::----:short
C标准库有limits.h头其中定义了每种整数类型的最大值和最小值的宏可以用它来确定某个实现中整数类型的范围。
十进制常量包含0~9的数字但是不能以0开头。
八进制常量包含0~7的数字必须以0开头。
十六进制常量包含09的数字和af的字母总是以0x开头。
字母大写或小写都可以。
int中可表示该值的最小类型。
对于八进制和十六进制常量类型判定顺序为int、unsigned
在常量后面加上字母L或l可以强制编译器把常量做为长整数处理。
在常量后加U或u可以指定无符号常量。
L和U可以结合使用。
对两个int进行算数运算时结果必须仍然可以用int表示否则就会发生溢出。
有符号整数溢出的行为是未定义的。
可能只是运算出错也可能程序崩溃。
无符号整数溢出时结果是正确值对2n取模。
n是存储结果的位数。
%d只适用于int类型。
无符号整数使用%u、%o、%x分别表示十进制、八进制、十六进制。
短整数在d、o、u、x前面加上h长整数在d、o、u、x前面加上l长长整数(C99)在d、o、u、x前面加上ll
显示长长整型%x和%o只适合用于显示无符号整数或正数。
因为printf会假设被转换的数值是无符号的如果符号位为1会显示一个预期外的大数。
显示负数的八进制或十六进制的情况很少。
需要显示时可以自己输出一个负号。
C语言的浮点数格式有三种float单精度浮点数double双精度浮点数long
IEEE标准提供了单精度和双精度的格式标准。
单精度32位双精度64位。
数值义科学计数法存储每个数由符号、指数和小数组成。
指数部分表示数值的可能大小小数部分的位数表示精度。
单精度数指数占8位小数占23位。
单精度数可以表示的最大值是由指数决定的指数范围-126到127(-127和128有特殊用途)指数最大是212732位小数位都是1时底数最大最大底数约等于2。
所以单精度数可表示的最大值为
浮点常量必须包含小数点或指数。
如果有指数需要在指数值前面加字母e或E。
默认情况下浮点常量以double的形式存储在需要时可以自动转为float。
为了让编译器以float格式存储可以在常量的末尾加上字母F或f要以long
C语言默认倾向于使用精度更高的double类型。
用float类型是为了节省空间和时间。
printf中e、f、g既可以写float也可以写double。
C99允许printf函数使用%le%lf和%lg但是字母l不起作用。
scanf和printf函数有可变长度的参数列表。
调用可变长度的参数列表时编译器会把float参数自动转成double类型。
这导致printf无法区分float和double所以%f在printf中既可以表示float又可以表示double。
而scanf是读取的值要通过指针传给变量%f和%lf必须区别开才能正确存储对应的字节数。
ld);十六进制浮点常量以0x或0X开头且必须包含指数(跟在字母p或P后面)。
指数以十进制表示可以为负代表2的幂。
如0x1.Bp3表示1.6875
十六进制浮点常量主要用于指定精度要求较高的浮点常量。
十进制数在转为二进制时可能受到舍入误差的影响而十六进制有精确的二进制表示。
目前最常用的字符集是美国信息交换标准码(ASCII)字符集。
它使用7位代码来表示128个字符。
char类型的变量可以用任意的单个字符赋值。
赋值时字符常量需要使用单引号括起来不能用双引号。
计算中出现字符时C语言只是使用它对应的整数值。
可以像比较数字那样对字符进行比较。
以数字的方式处理字符的坏处是编译器无法发现处理过程中的编程错误。
程序在使用不同字符集的机器上也可能会不兼容。
C标准没有规定char类型的数据是有符号还是无符号型。
有些编译器把它们当做有符号型来处理有些编译器当做无符号型处理。
为了保证可移植性不要假设char类型默认是signed或unsigned。
在需要作区别的时候使用signed
声明为char的变量存储的字符如果只有7位长度不需要考虑其符号。
如果有8位长度许多编译器会把它当做有符号的字符来处理。
后面这个变量只作为字符使用就不会有问题但是如果需要转换为整数就可能会有问题(结果为负数)。
一些特殊字符无法用键盘输入或不可见。
使用转义序列可以让程序处理字符集中的每一个字符。
字符转义序列说明\a警报符\b回退符\f换页符\n换行符\r回车符\t水平制表符\v垂直制表符\\反斜杠?问号’单引号双引号
字符转义序列很易使用但是只包含了最常用的字符。
有些无法打印的字符和ASCII码以外的字符没有被包含在内。
使用八进制做转义序列时由字符\和跟在后面的最多含3位数字的八进制数组成。
如\33或\033。
a);printf(\141\n);printf(\x61\n);return
a八进制和十六进制转义序列表示的数必须为无符号数所以八进制值最大为377。
标准C对十六进制数的位数没有限制在字符长度为8位时十六进制值最大为FF。
ch);scanf在读取数值时会自动跳过空白符但是读取字符时不会。
为了强制它读入字符前跳过空白字符可以在转换说明的前面加一个空格
ch);scanf不跳过空白符的特性可以用来检查是否是输入行的结尾。
getchar读入一个字符并返回。
putchar输出单个字符。
getchar和putchar的执行速度比scanf和printf要快。
因为不需要考虑数据的不同格式而且getchar和putchar是做为宏实现的。
scanf函数的返回值一般是1。
而getchar函数返回的是读取到的字符。
由此getchar能很方便的应用在需要对字符做条件判断的地方。
混用scanf和getchar时由于scanf会把没有消耗的任意字符留下getchar取到的字符可能不是希望的结果
C语言允许在表达式中混合使用基本类型。
而计算机执行算术运算时要求操作数有相同的位数和相同的存储方式。
C编译器会自动生成一些指令把操作数转换为合适的类型这样表达式才能被硬件计算。
这种编译器自动处理的转换称为隐式转换。
而由程序员使用强制运算符执行的是显式转换。
算术表达式或逻辑表达式中的操作数类型不同(常规算术转换)赋值表达式右侧表达式的类型和左侧变量的类型不匹配函数调用的实参类型和形参类型不匹配return语句中表达式类型和函数返回值类型不匹配。
常规算术转换会把两个操作数转换为可以安全地适用于两个数值的存储位数最小的类型。
通常是把存储位数较少类型的操作数转换为另一个操作数的类型。
这种操作称为提升。
double的顺序对存储位数小的操作数做提升。
两个操作数都不是浮点类型
先把两个操作数进行整值提升(确保没有字符型或短整型操作数)然后按int-unsigned
有符号操作数和无符号操作数混用时有符号操作数会转换为无符号的值。
转换过程会加上或者减去n1的倍数。
n是无符号整数可表示的最大值。
实际编程时要避免使用无符号整数更不要和有符号整数混用。
}C99中增加了一些新的类型转换规则也有变化。
它先规定了整数类型的转换等级
C99在任一操作数是浮点类型时规则同上。
在两个操作数都不是浮点类型时依次执行以下判定
int如果这时两个操作数类型相同就结束转换如果都是有符号型或都是无符号型把转换等级低的操作数转换为等级高的操作数类型如果无符号操作数等级高于或等于有符号操作数转为无符号操作数的类型如果有符号操作数的类型可以表示无符号操作数类型的所有值转为有符号操作数的类型其他情况都转换为与有符号操作数的类型对应的无符号类型。
浮点数赋值给整型变量时小数部分丢失过大的值赋值给存储位数较小的类型变量时会得到无意义的结果。
表达式C语言把(类型名)视为一元运算符其优先级高于二元运算符。
可以使用typedef定义新的类型避免使用int或其他可能因机器而变化的类型声明。
这样在需要更改更大的数据类型时很方便但是要修改转换说明(如%d改为%ld)依然很麻烦。
C语言库使用typedef为可能因实现而不同的类型创建类型名这些类型名一般以_t结尾。
C99的stdint.h头中使用typedef定义占用特定位数的整数类型名。
如int32_t是占用32位的有符号整型。
函数体内typedef定义的名称在函数体外是不识别的。
而宏的名称会在任何出现的地方被替换。
sizeof(类型名)返回值是一个无符号整数表示存储某个类型的字节数。
sizeof用于表达式时不需要加圆括号但是它做为一元运算符优先级比二元运算符高使用时为了方便理解最好加上圆括号。
在C89中最好在转换前把表达式的值转换为一种已知类型并在显示时使用对应的转换说明符。
C99中的printf可以直接显示size_t的值不发生强制转换方法是在转换说明中使用字母z
sizeof(int));C99引入了变长数组编译器不能用sizeof确定变长数组的大小。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback