C语言的类型提升机制

概念

在C语言中,整数类型按照其大小可以分为以下几类(从小到大):

  • char
  • short
  • int
  • long
  • long long

当在表达式中涉及这些类型的混合运算时,较小的类型会被提升为较大的类型。具体规则如下:

①charshort 在大多数情况下会被提升为 int

②如果 int 可以表示 charshort 的所有值,则 charshort 会被提升为 int

③如果 int 不能表示 charshort 的所有值(这种情况很少见,通常只在某些特殊硬件上发生),则 charshort 会被提升为 unsigned int

④intunsigned int 在运算时不会被提升为更大的类型,除非与更大的类型(如 long)混合使用。

⑤longunsigned long 在运算时通常不会被提升为 long long,除非与 long long 混合使用。

示例

来看这样的一段代码来了解这个机制的具体作用:

cpp 复制代码
#include <stdio.h>
#include <stdint.h>

int main()
{
	int8_t arr[4];
	uint8_t arr1[4];

	arr[0] = 0x00;
	int8_t x=~arr[0];
	if(x==~arr[0])
	{
		printf("int8_t x=%d\n", x);
	}else{}
	
	arr1[0] = 0x00;
	uint8_t y = ~arr1[0];


	if (y==~arr1[0])
	{
		printf("Hello World\n");
	}else{}

	return 0;
}

编译运行的输出结果为:

仅仅输出了第一个if语句内的内容,原因是什么呢?可以试着把第二个if语句内要输出的内容改成"hello world"试试,结果依然是只输出了第一个,初步推测是第二个if语句内的条件不为真导致的。

调试

按下F10开始调试,点击调试->窗口->监视;

然后设置三个观察条件,分别是arr10、y以及~arr10

在最后一个空的else代码块打断点,并且运行到它的if语句那一行;

可以看到和Keil一样,有断点(程序暂停)和箭头的UI(程序当前运行停止的位置)。

从监视栏也可以看到~arr10的类型从unsigned char类型被提升为了int型,并且此时y=255不等于~arr10

我们再直接输出结果看看:

可以看到如果强行及将~arr0作为unsigned char类型输出,结果是0xFFFFFFFF。

注意数据在一切计算机(单片机、Soc、PC等)中的存储形式都是补码,Visual Stdio中我们选择了32位的数据处理位宽那么此时~arr0的实际内容就是1111 11111 1111 1111 1111 1111 1111 1111。

更改一下占位符:

作为int类型输出,结果就是-1(-1的补码是32个1)。

注意

C语言的强弱类型之争到今天也没结束,类型提升导致的bug是可以通过良好的编码习惯避免的,我们在日常编程的过程中要尽量避免不同类型的数据之间进行数值比较。

相关推荐
研☆香11 分钟前
JavaScript 绘制简单不规则图形:三角形与五角星实战教程
开发语言·javascript·ecmascript
数聚天成DeepSData37 分钟前
企业知识库 RAG 数据准备与文档清洗:Dify、RAGFlow、扣子选型指南
开发语言·人工智能·机器学习·自然语言处理·sentinel·cocos2d
我是唐青枫37 分钟前
Java SLF4J 实战指南:从日志门面到 Logback、MDC 和链路追踪
java·开发语言·logback
aramae40 分钟前
C++11:现代C++的里程碑
c语言·开发语言·c++·windows·git·后端
weixin_446729161 小时前
java实现发送邮件
java·开发语言
无相求码1 小时前
为什么你的第二个 scanf 还没输入就直接跳过了?C语言输入缓冲区陷阱
c语言·后端
米尔的可达鸭1 小时前
深入操作系统 Socket 底层:EPOLLOUT 可写事件管理 + 非阻塞异步
开发语言·网络·数据结构·经验分享·websocket·网络协议
前端进阶之旅2 小时前
Next.js 16.3 新特性全解析 AI 驱动开发与 Instant Navigations 实战指南
开发语言·javascript·人工智能
小小编程路2 小时前
Java super 关键字详解:用法、场景与常见误区
java·开发语言
薛定猫AI2 小时前
【技术干货】大模型检查点可靠性评测:基于 Python 构建幻觉与指令遵循测试
开发语言·python