有趣的检查边界面试题

本文介绍了一个宏函数,用于检查程序的位宽。通过与sizeof(long)进行按位与运算,可以判断出程序是在32位还是64位环境下运行。文章还提到了这一技巧在Linux内核启动过程中的应用。

最近博主在某个群内有位程序员去面试遇到一个面试题:

此宏函数用来检查存储边界的对齐,请输入?应该填写什么?

#define UNA(x)((long)(x)&(?))

博主刚开看还真有点郁闷不知道填什么,后面梳理了一下这句话:此函数用来检查存储边界的对齐,仔细看一下这段代码

(long)(x)这段代码表示传递进来的值会被显示声明为long型也就是整数型其实也是显示的告诉编译器这个值是个整数(这样做的目的是防止传递字符,因为就算传递字符也会被当作整数来做处理,转化为ascii码),然后&(?)即将这两个数进行与运算!

那么这里就考虑到一个问题了,long类型是跟随编译器位数来确定字节长度的,在32位是4字节,64位是8字节,和int没有区别,所以更加表明的是这个宏函数其实是用来检查当前传递进来的值是否与当前程序位数位宽一致!

所以?里应该填写:

#define UNA(x)((long)(x)&(sizeof(long)))

调用:

int sun = UNA(4);

如果sun=4即表示当前程序位宽是32位的,如果不为4则表示当前程序位宽不是32位的,可能是16位也可能是64位~

这个面试题的原题是:

This macro function is used to check the alignment of storage boundaries

#define UNA(x)((long)(x)&(?))

分析到最后才知道上面说的检查存储边界的对齐实际上就是对程序位宽不同而对变量分配的字节数不同所做边界对齐检测,从2,4,8这几个值进行对齐就可以知道当前程序位数,所以如果命题是宏函数用来检查当前程序位宽是多少位会更加仔细一点。

后来博主觉得这个宏很有趣,但是感觉应该用不到,因为程序员怎么会不知道自己的程序是多少位的,后来在一些技术大牛的博客里看到对linux内核的分析里看到了这行代码,启动时linux会对自己的系统位数进行校验,而非是实现写好的,纯粹是自动进行校验,然后确定最大寻址位宽,和加载对应的xx位系统运行时动态库等系统位数划分工作,这样就实现了一处编译处处运行,省的编译32位时还需要重新修改某宏定义,所以要多擅用编译器指令~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

17岁boy想当攻城狮

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值