C语言进阶指南(类型转换、整型提升)

📅 发布时间:2026/7/11 2:19:16 👁️ 浏览次数:
C语言进阶指南(类型转换、整型提升)
显式转换我们可以将某个表达式强制转换成其他类型。代码语言cAI代码解释int i 25555; i (unsigned char)i;此时表达式中的i被转换unsigned char类型数值是211隐形转换我们前面已经了解了浮点数和整数的存储形式是完全不一样的但是在C语言中是可以用int类型的数据接收到float类型的数据的会发生精度丢失代码语言cAI代码解释float f3.14 int if;//i的值是3这是因为C语言会对不同的类型进行隐性转换。隐型转换的原因是因为计算机的特性决定的博主一知半解就不聊了--。隐形转换的规则如下1参与表达式的变量类型与优先级最高的变量类型一致比如代码语言cAI代码解释int i; long l; unsigned int ui; ilui;上式中整型i和无符号整型ui会被隐形转换成long类型因为long类型的数据占用8字节高于其他两位C语言中隐形转换的优先级如下1、如果整数类型与浮点型进行算术运算那么整数类型总是转换成浮点型2、如果整数类型占用的字节相同那么有符号整型总是转换成无符号整型参与计算代码语言cAI代码解释int i-10; unsigned int ui10; if (ui i) printf(uii); else printf(uii);如果i是有符号整型那么这个表达式是真的但是实际上这个判断表达式是0false。结果是打印uii.3、如果操作数的类型不一致那么占用内存低的会被隐形转换为操作数中占用内存高的数据类型浮点数数据的类型大小为long doubledoublefloat整数数据的类型大小为long long intlong intintshort intchar.2表达式的结果类型与赋值操作的左值一致无论左值的类型是什么表达式的结果总会被转换成与左值一致的类型代码语言cAI代码解释int i 25555; char ch -1; ch i ch;ch的结果为-46.没有被隐形转换注意隐形转换在表达式结束后就会消失不会说变量a在表达式中隐形转换成long类型之后就是long类型的变量。不足缺省整型int的整数类型参与计算时总是会被隐形提升为int类型。这种类型有shortunsigned shortcharunsigned char。这些类型在参与算术计算时如果没有被隐式转换成int及int类型以上的类型那么都会被转换成int类型。整型提升一个8位的数据char或unsigned char如何转换成一个32位的数据int 或unsigned int呢当发生这种位数的扩大时发生的便是整型提升。整型提升的方法如下如果是有符号整型根据符号位的位数来提升如果从32位提升至64位整数如果int型的符号位为1整型提升的过程就是在最高位补1.比如-1的存储位数为11111111 11111111 11111111 11111111整型提升后11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111括号中是被提升的位数如果是无符号整型那么提升的过程就只在最高位补0.数据截断数据不仅能转换成更高位还能转换成更低位。代码语言cAI代码解释int i2555; unsigned char chi;//i被转换成char类型截断的方法如下只保留后面符合转换类型的数位。比如上面的i的内存储存是00000000 00000000 00001001 11111011截断后只剩下符合unsigned char类型的后八个数位即11111011ch的值为251。注意无论是截断还提升都是只发生在表达式中的。并不会把i的实际数据类型变换在这个表达式过后i还是int类型