这篇博客目的只是记录今天笔试本人错误的题目,供后面复习用.并没有泄露试题的意思........
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)。