C语言中无符号数和有符号数之间的比较和运算

本文通过具体示例,深入解析C语言中不同数据类型(有符号与无符号整型)混合运算的规则与结果,强调了在32位机器环境下,非int型数据在运算前的转换原则,帮助读者理解混合运算的底层逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学C语言的同学看看以下代码运行结果会多少

源代码

#include <stdio.h>
void main(void)
{
	unsigned char uchar_num = 1;
	char schar_num = -2;

	unsigned int uint_num = 1;
	int sint_num = -2;

	printf("unsigned char 1 > char -2 \t= %d \r\n", (uchar_num > schar_num));
	printf("unsigned int 1 > int -2 \t= %d \r\n", (uint_num > sint_num));
	printf("unsigned char 1 > int -2 \t= %d \r\n", (uchar_num > sint_num));
	printf("unsigned int 1 > char -2 \t= %d \r\n", (uint_num > schar_num));

	printf("unsigned char 1 + int -2 \t= %d \r\n", uchar_num + sint_num);
	printf("unsigned int 1 + int -2 \t= %d \r\n", (uint_num + sint_num));

	if((uint_num + sint_num) > 0)
		printf("unsigned int 1 + int -2 \t大于0\r\n");
	else
		printf("unsigned int 1 + int -2 \t小于0\r\n");
}

运行结果, 看看有没有和自己意想不到的结果。

unsigned char 1 > char -2 	= 1 

unsigned int 1 > int -2 	= 0 

unsigned char 1 > int -2 	= 1 

unsigned int 1 > char -2 	= 0 

unsigned char 1 + int -2 	= -1 

unsigned int 1 + int -2 	= -1 

unsigned int 1 + int -2 	大于0

[Finished in 0.1s]

亡羊补牢,基本功夯实中

出现迷糊的同学应该是这两点没搞清楚,请熟记以下两点:

1、有符号数和无符号数混合运算时(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,返回无符号数结果

2、32位机器中,比int小的整型(包括short 、unsigned short 、 unsigned char和char)在运算中都要转换成int然后进行运算

掌握以上两条准则再回头看前面运行的结果是不是觉得就合理了。

至于为什么选择转换为int,应该是从效率上考虑的,因为通常情况下int的长度被定义为机器处理效率最高的长度,比如32位机

上,一次处理4个字节效率是最高的,所以虽然short(我机器上占2个字节)更节省内存,但是在运算中的效率,是int更高。

总结

混合计算时,非int型需要转换成有符号int型,原本就有unsigned int时,其他类型全部转成unsigned int后参与计算

辅助记忆的例子:

if(u32 a = 1 > s8 b = -2)

返回就是false

分析:有非int型 s8 b需要转换成s32 b,又因为有u32参与计算,s32 b又需要被转换成u32 b = 0xffff ffff ffff fffe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值