今天分享一个有意思的题目,考察了两个C语言容易被忽视的知识点。
题目:
写一个宏定义,不用大于号>、小于号<和if,判断正整数a,b的大小。
一种答案:
#define max(a,b) (((long)(a-b)) & 0x80000000)?b:a
解答:
0x80000000 的二进制是:1000 0000 0000 0000 0000 0000 0000 0000(第一位是符号位,所以此数是负数)
如果a-b是正数:根据二进制数的表示, 分为符号位跟数值位,0正1负,所以a-b的最高位是0,那么与上1000 0000 0000 0000 0000 0000 0000 0000之后,三元运算符判断条件结果是0,输出a
如果a-b是负数:那最高位是1,与上1000 0000 0000 0000 0000 0000 0000 0000之后,三元运算符判断条件结果是1,输出b
考察知识点:
1、与或非
2、三元运算符
拔高题(大厂笔试题):
写一个宏定义,不用大于号>、小于号<和问号?,判断正整数a,b的大小。
大家可以在评论区留下自己的答案,最优秀的答案有红包奖励。
本文分享自 嵌入式Linux系统开发 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!