C语言 int和unsigned int逻辑比较

测试

  • 在IAR(8.40.2)平台下测试
  • 单片机为STM32F103ZET6

1、测试 CMP (int,int)

//a = -2,b = 3
int test_fun(int a,  int b)
{
  if(a>b)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}
//执行结果 0  正常

在这里插入图片描述

2、测试 CMP (int ,unsigned int)

//a = -2,b = 3
int test_fun(int a, unsigned int b)
{
  if(a>b)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}
// 执行结果 1 异常

在这里插入图片描述

3、测试 CMP (unsigned int ,unsigned int)

//a = -2,b = 3
int test_fun(int a, unsigned int b)
{
  if((unsigned int)a>b)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}
// 执行结果 1 异常 汇编结果同测试2

在这里插入图片描述

4、测试 CMP(int ,常量)

	test_fun(-2, 3);
	//int a = -2;
	//if(a > 100)   =>false    等价于 if(a > (int)100)
	//if(a >100U)   =>true     等价于 if(a > (unsigned int)100)
	printf("%d",a > 0x7FFFFFFA);//false
	printf("%d",a > 0x8FFFFFFA);//true

总结

  • 1、判断两边符号相同时,判断结果和理论一样是正常的。
  • 2、判断两边符号不相同时,判断结果会和理论不一样,需要进行类型转换后再做比较。
    • int和unsigned int 比较时,int会自动转换为unsigned int类型。其实也就是将int类型存储数值的补码当作unsigned int数据处理了。
    • 正数的补码等于原码,负数的补码等于反码+1。负数强转为正数,直接将负数补码当作原码处理就是强转后的值。
  • 3、都为int类型的判读汇编语句和都为unsigned int类型的判断汇编语句是不一样的。
  • 4、在人为判断结果时,
    • 如果判断两边符号相同,则以理论比较结果为准。(该谁大就谁大)
    • 如果判断两边符号不相同,则需要将符号转换后再做比较。(负数强转正数时,取其补码当原码)
  • 5、在32位单片机平台中,常量默认为int类型。如果有特殊需求,需要对常量进行类型修饰。
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值