嵌入式驱动面试题:宏定义判断大小,不能使用大于、小于、if语句

    技术2025-10-26  11

    题目:请定义一个宏,比较两个数a,b的大小,不能使用大于、小于、if语句。

    刚看到这个题目的时候,有个提示 :判断a-b结果最高位情况,继而得到大小关系。 没仔细看答案,决定自己分析一下(其实是看代码没分析明白)。

    大于,等于,小于 三种情况 1.等于最好分析 :a-b = 0即可 2.大于情况分析:a>b (1)a>0,b>0,a-b>0 (2)a>0,b<0 (3)a<0,b<0,a-b>0 3.小于情况:排除法得到 代码 1.定义个宏Z 判断 是否为正数,是正数返回:真(不等于0) 2.定义个宏F 判断 是否为负数,是负数返回:真 遇到的坑:负数右移31位后得到的数是-1,符号位不移动。 3.定义宏COMP 返回999为等于(小BUG),返回真为大于,返回0为小于

    #include "stdafx.h" #include "stdio.h" #define Z(a) ((unsigned)a>>31==0) #define F(a) ((unsigned)a>>31==1) #define COMP(a,b) (!(a-b))? 999:( (Z(a)&&Z(b)&&Z(a-b)) || (Z(a)&&F(b)) || (F(a)&&F(b)&&Z(a-b))) int main(int argc, char* argv[]) { int a = -10,b = -10000; if(COMP(a,b)==999) printf("====等于====\n"); else if(COMP(a,b)==0) printf("<<<<小于<<<<\n"); else printf(">>>>大于>>>>\n"); return 0; }

    欢迎指错!!

    Processed: 0.010, SQL: 9