搜索
bottom↓
回复: 17

腾讯的一道笔试题, 觉得还是比较考验基础的.

[复制链接]

出0入0汤圆

发表于 2013-4-15 16:20:19 | 显示全部楼层 |阅读模式
本帖最后由 monkerman 于 2013-4-15 16:35 编辑
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         long long a = 1;
  5.         long long b = 2;
  6.         long long c = 3;

  7.         printf("%d %d %d\n", a, b, c);

  8.         return 0;
  9. }
复制代码
32位环境, CPU为小端模式, 所有的参数都是通过栈传递的, 问: 输出结果是什么? 并解释一下.
// 注: VC6++ 不支持 long long 类型. 测试时注意.  推荐 GCC, 要是用 MDK / IAR 什么的应该也可以. 不过结果可能和腾讯的答案差距较大. 人家又不是搞嵌入式的.

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-4-15 16:23:34 | 显示全部楼层
好吧. 帖子发在 ARM 板块, 是想引出一些题目漏洞.

出0入0汤圆

发表于 2013-4-15 16:40:29 | 显示全部楼层
貌似我也做过, 当时答的是随机值,  后来发现不对, 是固定值。

出0入0汤圆

 楼主| 发表于 2013-4-15 16:48:36 | 显示全部楼层
skylly3 发表于 2013-4-15 16:40
貌似我也做过, 当时答的是随机值,  后来发现不对, 是固定值。


不是随机值. 是固定的. 而且有迹可循. 我也是运行后, 回味了题目, 看了反汇编才明白过来的.

出0入0汤圆

发表于 2013-4-15 16:51:34 | 显示全部楼层
1 0 2
栈传递,是个提示

出0入0汤圆

发表于 2013-4-15 16:54:27 | 显示全部楼层
难道long long 这种古怪的类型压不到栈里去?那也要看编译器吧,不见得谁都压不进去。静等大神讲解

出0入0汤圆

发表于 2013-4-15 17:31:27 | 显示全部楼层
腾讯 —— 笔试考这个? 不是考“你认为现在哪个东西值得抄?”么?

出0入0汤圆

发表于 2013-4-15 18:14:42 | 显示全部楼层
csdn看过,一共三道题。

出0入0汤圆

发表于 2013-4-15 18:16:09 | 显示全部楼层
这题敢情是专考半熟的人的?初学的大概还不会答错。

实际试了一下,和事先想的一样,无聊。
贴个warning信息,很明了。
test.c: In function ‘main’:
test.c:9: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long long int’
test.c:9: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘long long int’
test.c:9: warning: format ‘%d’ expects type ‘int’, but argument 4 has type ‘long long int’

出0入0汤圆

 楼主| 发表于 2013-4-15 18:40:29 | 显示全部楼层
tragedy 发表于 2013-4-15 18:14
csdn看过,一共三道题。

就是从那里弄来的........

出0入0汤圆

 楼主| 发表于 2013-4-15 18:41:19 | 显示全部楼层
fantaq 发表于 2013-4-15 18:16
这题敢情是专考半熟的人的?初学的大概还不会答错。

实际试了一下,和事先想的一样,无聊。

无聊?? 能解释下结果为啥么?

出0入4汤圆

发表于 2013-4-15 19:03:16 | 显示全部楼层
本帖最后由 sniper.q 于 2013-4-15 19:32 编辑

用builder模拟了下 结果:1 0 2

想明白了

long long是8个字节的,printf按4字节取,栈的数据换成4字节是10,20,30,所以实际输出是a的低位:1,a的高位:0;b的低位:2

出0入0汤圆

发表于 2013-4-15 19:33:33 | 显示全部楼层
是因为long long无法压栈吗??

出0入0汤圆

发表于 2013-4-15 20:39:10 | 显示全部楼层
monkerman 发表于 2013-4-15 18:41
无聊?? 能解释下结果为啥么?


呵呵,较真一下,再补充说明下,之前这个是我拿GCC试的,64位ubuntu,看warning的意思的printf默认的参数是按32位处理的。
刚才拿VC2010试了下, 还真是1 0 2
VC2010已经能认long long了。

本来变参压栈好像是应该是什么就压什么,long long 应该压8byte
但是GCC好像是做的比较聪明,它会判断printf的串,%d就是4byte, 见到%PRId64才会8byte.

既然不同编译器不一样,这问题就没意思了,跟研究回字4种写法差不多了。知道就行了,一个printf搞这么透没意思,我这人向来不求甚解,哈哈。

出0入0汤圆

 楼主| 发表于 2013-4-16 09:05:02 | 显示全部楼层
fantaq 发表于 2013-4-15 20:39
呵呵,较真一下,再补充说明下,之前这个是我拿GCC试的,64位ubuntu,看warning的意思的printf默认的参 ...

嗯. 个人觉得 printf 还是很有用的. 有时候需要自己实现的, 有机会求甚解那就解解.
这题其实就是 long long 64位, printf 参数入栈顺序从右到左(貌似是标准规定. 如果分三次 printf, 结果就又不一样了.), 栈的增长方向从高到低地址. %d 只取 4字节(标准), 大小端模式.
题目里没提到的就是栈的增长方向, 这个在 ARM 平台下就有问题了. 因为 ARM 的堆栈有四种模式. 不过常用的几乎都是满递减. 人家企鹅又不是搞这个的.
另外 %lld/%I64d 就可以打出 64 位数值.

出0入0汤圆

发表于 2013-4-17 07:54:11 | 显示全部楼层
学习学习!

出0入0汤圆

发表于 2013-4-17 08:10:20 | 显示全部楼层
这个帖子可以了解printf,栈,还不错

出0入0汤圆

发表于 2013-8-14 08:50:45 来自手机 | 显示全部楼层
mark……
顶一个…
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 11:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表