2015春季腾讯实习在线测试题之求int型字节长度,不准用sizeof

不使用sizeof,求某机器平台的int型整数位数(16,32,64)

思路,将整数变成字符串处理,并且在内存的末尾填零,即字符串结束符。

如 0x0012,0x00123456,0x00123456789ABCDE分别对应16,32,64位数; 小端机

代码

#include <stdio.h>

#include <string.h>

int main(int argc , char *argv[])

{

intn16 = 0x0012;

/*

此处用于填充内存防止出现内存连续

如, 32位机器上。

*/

intnIntNop1 = 0;

intnIntNop2 = 0;

intn32 = 0x00123456;

intnIntNop3 = 0;

intnIntNop4 = 0;

intn64 = 0x00123456789ABCDE;

intnInt16 = strlen((char *)&n16);

intnInt32 = strlen((char *)&n32);

intnInt64 = strlen((char *)&n64);

if(1== nInt16 && 2 == nInt32 && 2 == nInt64)

{

printf("16Bits\n");

}

if(1== nInt16 && 3 == nInt32 && 4 == nInt64)

{

printf("32Bits\n");

}

if(1== nInt16 && 3 == nInt32 && 7 == nInt64)

{

printf("64Bits\n");

}

return0;

}

反汇编分析:

5:       int n16 = 0x0012;

00401028  mov         dword ptr [ebp-4],12h

6:       int nIntNop1 = 0;

0040102F   mov         dword ptr [ebp-8],0

7:       int nIntNop2 = 0;

00401036  mov         dword ptr [ebp-0Ch],0

8:       int n32 = 0x00123456;

0040103D  mov         dword ptr [ebp-10h],123456h

9:       int nIntNop3 = 0;

00401044  mov         dword ptr [ebp-14h],0

10:      int nIntNop4 = 0;

0040104B  mov         dword ptr [ebp-18h],0

11:      int n64 = 0x00123456789ABCDE;

00401052  mov         dword ptr [ebp-1Ch],789ABCDEh

12:      int nInt16 = strlen((char *)&n16);

00401059  lea         eax,[ebp-4]

0040105C   push        eax

0040105D  call        strlen (004011b0)

00401062  add         esp,4

00401065  mov         dword ptr[ebp-20h],eax

13:

14:      int nInt32 = strlen((char *)&n32);

00401068  lea         ecx,[ebp-10h]

0040106B  push        ecx

0040106C   call        strlen (004011b0)

00401071  add         esp,4

00401074  mov         dword ptr[ebp-24h],eax

15:

16:      int nInt64 = strlen((char *)&n64);

00401077  lea         edx,[ebp-1Ch]

0040107A   push        edx

0040107B  call        strlen (004011b0)

00401080  add         esp,4

00401083  mov         dword ptr[ebp-28h],eax

17:      if(1 == nInt16 && 2 == nInt32 && 2 == nInt64)

00401086  cmp         dword ptr [ebp-20h],1

0040108A   jne         main+95h (004010a5)

0040108C   cmp         dword ptr [ebp-24h],2

00401090  jne         main+95h (004010a5)

00401092  cmp         dword ptr [ebp-28h],2

00401096  jne         main+95h (004010a5)

18:      {

19:           printf("16 Bits\n");

00401098  push        offset string "16Bits\n" (00422034)

0040109D  call        printf (00401130)

004010A2   add         esp,4

20:      }

21:      if(1 == nInt16 && 3 == nInt32 && 4 == nInt64)

004010A5   cmp         dword ptr [ebp-20h],1

004010A9   jne         main+0B4h (004010c4)

004010AB  cmp         dword ptr [ebp-24h],3

004010AF  jne         main+0B4h (004010c4)

004010B1  cmp         dword ptr [ebp-28h],4

004010B5  jne         main+0B4h (004010c4)

22:      {

23:           printf("32 Bits\n");

004010B7  push        offset string "32Bits\n" (00422028)

004010BC  call        printf (00401130)

004010C1   add         esp,4

24:      }

25:      if(1 == nInt16 && 3 == nInt32 && 7 == nInt64)

004010C4   cmp         dword ptr [ebp-20h],1

004010C8   jne         main+0D3h (004010e3)

004010CA  cmp         dword ptr [ebp-24h],3

004010CE  jne         main+0D3h (004010e3)

004010D0  cmp         dword ptr [ebp-28h],7

004010D4  jne         main+0D3h (004010e3)

26:      {

27:           printf("64 Bits\n");

004010D6  push        offset string "64Bits\n" (0042201c)

004010DB  call        printf (00401130)

004010E0  add         esp,4

28:      }

29:      return 0;

004010E3  xor         eax,eax

30:  }

004010E5  pop         edi

004010E6  pop         esi

004010E7  pop         ebx

004010E8  add         esp,68h

004010EB  cmp         ebp,esp

004010ED  call        __chkesp (00401230)

004010F2   mov         esp,ebp

004010F4   pop         ebp

004010F5   ret

Vc6.0下  32位平台

初始寄存器:执行5:xxx 语句之前

EAX = CCCCCCCC EBX = 7EFDE000

ECX= 00000000 EDX = 002A1810

ESI= 00000000 EDI = 0018FF48

EIP= 00401028 ESP = 0018FED4

EBP= 0018FF48 EFL = 00000202

初始内存

0018FEFB CC CC CC CC CC CC CC  烫烫烫.

0018FF02 CC CC CC CC CC CC CC  烫烫烫.

0018FF09 CC CC CC CC CC CC CC  烫烫烫.

0018FF10 CC CC CC CC CC CC CC  烫烫烫.

0018FF17 CC CC CC CC CC CC CC  烫烫烫.

0018FF1E CC CC CC CC CC CC CC  烫烫烫.

0018FF25 CC CC CC CC CC CC CC  烫烫烫.

0018FF2C  CC CC CC CC CC CC CC  烫烫烫.

0018FF33 CC CC CC CC CC CC CC  烫烫烫.

0018FF3A  CC CC CC CC CC CC CC  烫烫烫.

0018FF41 CC CC CC CC CC CC CC  烫烫烫.

0018FF48 88 FF 18 00 59 13 40  [email protected]

之后  内存

0018FEFB CC CC CC CC CC CC CC  烫烫烫.

0018FF02 CC CC CC CC CC CC CC  烫烫烫.

0018FF09 CC CC CC CC CC CC CC  烫烫烫.

0018FF10 CC CC CC CC CC CC CC  烫烫烫.

0018FF17 CC CC CC CC CC CC CC  烫烫烫.

0018FF1E CC CC 04 00 00 00
03  烫.....  4是因为那个DEBC9A78的缘故最后不是0

0018FF25 00 00 00
0100 00 00  .......   此处分别是 1 和3 即是32位下的

0018FF2C  DE BC 9A 7800 00 00  藜歺...   那个没有放下的整数0x00123456789ABCDE

0018FF33 00 00 00 00 00 56 34  .....V4         截取了末位的八个字节

0018FF3A  12 00 00 00 00 00 00 .......           32位整数0x00123456

0018FF41 00 00 00 12 00 00 00  .......

0018FF48 88 FF 18 00 59 13 40  [email protected]

收尾之后

0018FEED CC CC CC CC CC CC CC  烫烫烫.

0018FEF4 CC CC CC CC CC CC CC  烫烫烫.

0018FEFB CC CC CC CC CC CC CC  烫烫烫.

0018FF02 CC CC CC CC CC CC CC  烫烫烫.

0018FF09 CC CC CC CC CC CC CC  烫烫烫.

0018FF10 CC CC CC CC CC CC CC  烫烫烫.

0018FF17 CC CC CC CC CC CC CC  烫烫烫.

0018FF1E CC CC 04 00 00 00 03  烫.....

0018FF25 00 00 00 01 00 00 00  .......

0018FF2C  DE BC 9A78 00 00 00  藜歺...

0018FF33 00 00 00 00 00 56 34  .....V4

0018FF3A  12 00 00 00 00 00 00  .......

0018FF41 00 00 00 F2 10 40 00  [email protected]  004010ED call __chkesp (00401230) 之后改变了值,估计是已经回收了内存,有待日后研究。

0018FF48 88 FF 18 00 59 13 40  [email protected]

原来的错去程序

#include <stdio.h>

#include <string.h>

int main(int argc , char *argv[])

{

intn16 = 0x0012;

intn32 = 0x00123456;

intn64 = 0x00123456789ABCDE;

intnInt16 = strlen((char *)&n16);

intnInt32 = strlen((char *)&n32);

intnInt64 = strlen((char *)&n64);

if(1== nInt16)

{

printf("16Bits\n");

}

if(3== nInt32)

{

printf("32Bits\n");

}

if(7== nInt64)

{

printf("64Bits\n");

}

return0;

}

初始执行前

EAX = CCCCCCCC EBX = 7EFDE000

ECX= 00000000 EDX = 004F1810

ESI= 00000000 EDI = 0018FF48

EIP= 00401028 ESP = 0018FEE4

EBP= 0018FF48 EFL = 00000206

0018FEFB CC CC CC CC CC CC CC  烫烫烫.

0018FF02 CC CC CC CC CC CC CC  烫烫烫.

0018FF09 CC CC CC CC CC CC CC  烫烫烫.

0018FF10 CC CC CC CC CC CC CC  烫烫烫.

0018FF17 CC CC CC CC CC CC CC  烫烫烫.

0018FF1E CC CC CC CC CC CC CC  烫烫烫.

0018FF25 CC CC CC CC CC CC CC  烫烫烫.

0018FF2C  CC CC CC CC CC CC CC  烫烫烫.

0018FF33 CC CC CC CC CC CC CC  烫烫烫.

0018FF3A  CC CC CC CC CC CC CC  烫烫烫.

0018FF41 CC CC CC CC CC CC CC  烫烫烫.

0018FF48 88 FF 18 00 39 13 40  [email protected]

执行后

0018FF25 CC CC CC CC CC CC CC  烫烫烫.

0018FF2C  CC CC CC CC 07 00 00  烫烫...

0018FF33 00 03 00 00 00 01 00  .......

0018FF3A  00 00 DE BC 9A 7856  ..藜歺V 执行n64 和 n32赋值之后  恍然大悟。。

0018FF41 34 12 00 12 00 00 00  4......     对内存把握不够。。果断牺牲。

0018FF48 88 FF 18 00 39 13 40  [email protected]

若是64位机器则 包含两个0填充

目测是这样的

DE BC 9A78 56 34 12 00

00 00 00 00 00 00 0000填充的0

00 00 00 00 00 00 00 00

56 34
12 00 00 00 00 00

00 00 00 00 0000 00 00

00 00 00 00 00 0000 00

12 00 00 00 0000 00 00

若是16位机器 
目测是这样的

DE BC

00 00

00 00

56 34

00 00

00 00

12 00

时间: 2024-11-06 03:55:02

2015春季腾讯实习在线测试题之求int型字节长度,不准用sizeof的相关文章

【新鲜出炉的,快到碗里来】2015腾讯实习产品类笔试题

昨晚做了2015腾讯实习产品类在线笔试题做题做到累觉不爱啊各种时间不够觉得智商捉急啊 为了攒rp,lz截屏截到手抽筋啊,统统发上来在线测试包含: 评估名称 您需要的全部时间 您需要什么 数字推理测试 45分钟 计算器,笔和纸,鼠标 语言推理测试 45分钟 鼠标 逻辑推理测试 45分钟 笔和纸,鼠标 性格问卷 25分钟 鼠标 邮件里时间这么长,其实不是啊~是25+19+25min(见附件~) 总结起来,其实题目不难我练习部分正确率挺高的8题错1-2题但是练习题时间没限制而且也比实际考试题简单我前面

2015微软实习在线笔试题 - Professor Q&#39;s Software

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Professor Q develops a new software. The software consists of N modules which are numbered from 1 to N. The i-th module will be started up by signal Si. If signal Si is generated multiple times, the i-th module

讯飞在线语音合成

讯飞在线语音合成 效果图 源码 下载地址(Android Studio工程):http://download.csdn.net/detail/q4878802/9062261 下载SDK 1. 选择服务 2. 选择平台 3. 选择应用 4. 下载SDK 说明 之前的工程都是在Eclipse下演示的,随着Android Studio的普及,我这里也开始使用Android Studio写Demo,虽然细节导入jar包和so库的过程可能不太一样,但是整体的流程是一样的. 将jar包和so库导入Andr

在腾讯实习的那段日子:不要在难受的时候选择 &#39;逃避/离开&#39;

时间过得很快,从2014.6.5入职实习到2015.1.5已经是7个月的时间了,在这边还是学到了很多东西,遇到的人大多数比较nice.中间拿到了留任offer,本来也是想来深圳,也就没有再去找工作.实习过程做了不少事,也遇到一些坑,犯过几个小错误.此篇不会记录流水账,也不会写技术细节,关于生活经历可能会在空间写写吧,在这里就是做些总结,和摸索以后要走的路. 工作.为人处事.心态篇: 1. 尽量用低权限用户操作,特别是涉及数据库表的删除和目录文件的删除,需要特别小心! 2. 涉及组外的工作,如果不

惊喜总在转角处——拿到腾讯实习offer的前后小事

一.前言 这不是面经,仅仅是自己一路走来的些许琐碎小事与心路历程,欢迎园友吐槽,但是不要太凶残哦. 二.旧年小事 去年11月底,从上海实习公司请假回校参加研究生毕业论文开题答辩,在校忙碌了一段时间,论文开题答辩如期顺利结束.答辩完已经是12月底,此前在外实习了近8个月,我犹豫了两三天,辞去了上海的实习,准备此后在校静修一段时间:整理一下之前实习时的一些收获.看以前想看但一直没时间看的一些书.参与导师的项目... 忙完论文开题答辩的时候学校已经快要放寒假了,于是就没与导师沟通准备参与项目的想法,去

2015年阿里研发工程师实习在线笔试题

投递了阿里的C/C++方向研发,昨天晚上参加在线笔试时完全懵了,各种数学题.智力题,以及各种看似风马牛不相及的题目在一起,各位感受下. 题目中涉及到排列组合 基本数学问题等.下面关于以上部分题目给出自己的意见,如果有不对的地方,希望各位指正. 关于数N!有多少个零 思路:给定一个整数N,那么N的阶乘N!末尾有多少个0的问题可以转换为N!乘式中可以分解出多少个5的问题.因为5和其前面的任何一个偶数相乘都会产生0,所以只需求出在由1到N的数中共可以分解出多少个5.例如25!,可以分解出5(1×5).

在腾讯实习的那段日子:不要在难受的时候选择逃避离开

时间过得很快,从2014.6.5入职实习到2015.1.5已经是7个月的时间了,在这边还是学到了很多东西,遇到的人大多数比较nice.中间拿到了留任offer,本来也是想来深圳,也就没有再去找工作.实习过程做了不少事,也遇到一些坑,犯过几个小错误.此篇不会记录流水账,也不会写技术细节,关于生活经历可能会在空间写写吧,在这里就是做些总结,和摸索以后要走的路. 工作.为人处事.心态篇: 1. 尽量用低权限用户操作,特别是涉及数据库表的删除和目录文件的删除,需要特别小心! 2. 涉及组外的工作,如果不

腾讯的一道测试题

前几天做了腾讯的测试题,有一道题挺有意思的,题目的大意是: 有36辆摩托车6个赛道,在没有计时器的情况下,如果要选出跑的最快的三辆车,至少需要几次比赛? 我最初的想法是:要选出最快的三辆车,先让这36辆车分成6组,每一组比一下,选出每一组的第一名,然后让这6个第一名比一次,选出前三名就行了,果断的选择了7次,显然这是错误的(这个题和田忌赛马有那么一点点的相似,看来的我智商不如古人啊.....囧). 后来仔细一想,我觉得应该这么想:假设36辆车被分配到了A,B,C,D,E,F六组中,我们给每一组比

百度实习在线笔试题【逆序问题】

自己写的代码,未经测试 ////baidu实习岗在线测评 ////一组01的二进制字符串,要求不为逆序,需要交换几次位置. // #include <iostream> #include <vector> using namespace std; typedef struct{ unsigned int num; vector<char*> data; }SInput; void pInputData(SInput &input) { int i; cin>