有趣的检查边界面试题

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

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

#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位时还需要重新修改某宏定义,所以要多擅用编译器指令~

猜你喜欢

转载自blog.csdn.net/bjbz_cxy/article/details/80809527