2013腾讯实习生笔试错误题目集锦

这篇博客目的只是记录今天笔试本人错误的题目,供后面复习用.并没有泄露试题的意思........

1. 32位的机子,下面的说法哪些是正确的?

    signed char a = 0xe0;
    unsigned int b = a;
    unsigned char c = a;

A. a>0 && c>0

B. a==cC. b的十六进制的表示是:0xffffffe0
D. 以上说法都是错误的

正确的答案应该是C。

解析一下:A错,signed char比较时候类型要提升成int,符号位是补最高位的1,所以a应该是负数

B错:a和c都要要先转换成int类型才进行比较,a转换成int后是负数,c转化成int之后是正数

C对:signed char先转化成int类型再转化成unsigned int类型,signed char转化成int时候要进行符号扩展,

因为是有符号类型,所以最高位就是补1.(大家不确定可以自己敲代码看看...一开始我也是有点想不明白)。


2. 下面哪些选项能编译通过?

    int i;
    char a[10];
    string f();
    string g(string &str);

A. if(!!i){f();} 

B. g(f())

C. a=a+1 

D. g("ABC")

答案是A

B错:f()返回一个临时值,这个值传给g函数,但是g函数参数类型是非const的,是无法应用临时变量的(为了方便理解,

你可以觉得临时值是一个const类型变量).如何大家不信,可以去编译试一试,会出现错误:
invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string'|
C错:因为a是一个地址常量,不能被重新赋值
D错:因为“ABC”是一个const char*类型,而g函数参数还是非const的..


3. int a[10]; 下面哪些不可以表示a[1]的地址?

A. a+sizeof(int)

B. &a[0]+1 

C. (int*)&a+1 

D.(int*)((char*)&a+sizeof(int))

答案选A

注意a的类型是int[10],所以a+1和一个int*类型+1的效果是一样的,其实说到底还是隐式类型转换

1其实会先转换成int*类型,再和a进行求和!所以A其实就是等于a+4,得到的是a[4]的地址。

B. 通过上面分析知道&a[0]其实类型就是int*,所以+1不是加一个字节,而是加一个元素。

C. 同B

D. 将a的地址转换成char*,这个时候+1就是加一个char,也就是一个字节,实际上要加sizeof(int)才能到a[1].


4. 在一个big endian(大端)的32位机器上,b的结果是什么?

    unsigned int a = 0x1234;
    char b = *((char*)&a);

答案是:0

uint是4个字节的,所以0x1234的完整表示是0x00001234,因为是大端(高位放在低字节,低位放在高字节),所以&取地址,当成字节去看,会取得最左边的00字节的地址,再转换成char的话,值应该是0.

如果是用小端表示,取到字节是0x34,所以应该是52.(一般x86的机子都是用小端表示的,所以你将程序放到你x86地机子会得到结果是52)。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值