在网上转,看到一套题,尝试解一下。
23. In little-endian systems, what is the result of following C program?
typedef struct bitstruct{
int b1:5;
int :2;
int b2:2;
}bitstruct;
void main(){
bitstruct b;
memcpy(&b,”EMC EXAMINATION”,sizeof(b));
printf(“%d,%d\n”, b.b1, b.b2);
}
解:
b的大小只有4字节,且b只用了里面的9个bit。memcpy实际拷贝了'EMC '(带空格)四个char进入b。只有前9个bit有用,即EM两个char有用。
E的ascii码为:0x45,即0100 0101,M的为0x4D,即0100 1101;
在内存中,对应的二进制数分别为:1010 0010(对应E),1011 0010 (对应M)
这样b.b1 在内存中为:10100 空两位 b.b2为 :01
下面printf显示的时候,还要转换过来,对于b.b1转换为:00101且因其为int,以最高位扩展,为000000000000101(没有数多少个0,意思一下),即值显示为5
而b.b2将转换为 10,以最高位符号位扩展为:11111111111111110(没数多少1),即-2的补码,显示为-2;
问题有:1、一般情况下,对于位段不能声明为int,要为unsigned int 或者 signed int 好一些,因为很多地方写的说在位段中,对于int的解释跟编译器有关,并无统一。2、我是第一次知道小端原来对bit也是低位存低处,高位存高处的。。。我以为就字节这么存。。涨知识了。。
24. In IA-32 systems, what is the result of following C program?
#define MAX 255
int main(){
unsigned char A[MAX+1],i;
for(i=0;i<=MAX;i++)
A[i]=i;
printf(“%d\n”,A[0]);
Return 0;
}
问这道题执行出来显示的是什么?
什么都不显示,无穷循环,主要在于看到变量i的声明,为unsigned char最大255,无法比MAX值更大,跳不出循环。
问题:问题的选项里有个compile error选项,我在想,那个Return也不对啊,莫非是真正笔试的时候将这些问题忽略???
25. What is the result of following C program?
int inc(int a){
return (++a);
}
typedef int (*FUNC1) (int in);
int multi(int *a, int *b, int *c){
return (*c=*a**b);
}
typefef int (FUNC2) (int *, int *, int *);
void show(FUNC2 fun, int arg1, int *arg2){
FUNC1 p=&inc;
int temp=p(arg1);
printf(“%d\n”,*arg2);
}
Main(){
Int a;
Show(multi,10,&a);
Return 0;
}
依然问,执行出来显示的是什么?
此题估计目的是考察初始化问题,这里变量a 未初始化,里面值未定,当参数传给show后,printf显示未定。
问题:又出现了上面那题的情况,笔试时估计要忽略程序中的书写小问题。大写的int 大写的return。。都不管。。
26. What will the following C function f2() print?
void f1(char *s,.char *t){
if(*s==’\0’) return;
*t=*s;
f1(++s,++t);
}
void f2(){
char *s1=”The C Programming Language is good”;
char *s2=”The C Programming Language”;
char *t=(char *)malloc(strlen(s1)+1);
memset(t,0,strlen(s1)+1);
f1(s1,t);
f1(s2,5);
printf(“%s\n”,t);
}
f1(s2,5);没用,而且传了个int进f1,还对这个5进行解引用,会报段错误。函数作用就是将s1全部拷贝入t,但差个'\0'没拷贝,不过因为t被memset过,清过0,所以还能正确显示
27. In C++, Class A is defined simply as:
Class A{};
What is results of calling sizeof(A)?
实测显示1,原因暂时不明,标记一下,以后的我一定要看到!!!写下原因
28、What will the following C++ function print?
int func()
{
float a=1.0f;
cout<<boolalpha<<( (int)a==(int &)a )<<” ”;
float b=0.0f;
cout<<boolalpha<<( (int)b==(int &)b )<<endl;
}
1、首先看第一个cout;
对于(int)a ,是将a的小数部分直接省略(这块说是话我没查资料,根据以往记忆写这句话的),所以(int)a值为1;
而(int &)a意思是将a 浮点数直接解释为整数,一定注意!!那么a的浮点数为多少呢,32位机器上,IEEE表示浮点数分三个部分,符号位 1位,阶码8位,尾码23位。
值记做V = ( -1)^s x M x 2^E,其中,s为符号位数字0或1,M = 1 + f,其中 f 是尾码数,E = e - bias(这里因为1.0是normalized的浮点数,所以用这个公式),其中e为阶码数;
这里符号位为0,因为是正数。Bias由公式2^(k-1) - 1,k为阶码个数8,即Bias为127。公式看着很烦,但是真的很简单。
对于十进制的1.0其二进制的数也是1.0,即1.0 X 2 ^ 0 ,对应上面V = (-1)^s x M x 2 ^E公式,去掉(-1)^s,因为没符号。M = 1.0,E = 0;
继续套公式 f = M -1 = 0000 0000 0000 0000 0000 000(f是尾码,前面说了,有23位) , e = E + bias = 0 + 127 = 0111 1111,这就得出来了,IEEE下浮点数1.0f的表示方法:
0 (1位符号位) 0111 1111 (8位阶码exponent) 0000 0000 0000 0000 0000 000(23位 尾码 significand),总共32位,这个二进制数对应的十进制数为1065353216,
这个肯定和1是不同的,所以为false。
2、对于第二个cout
b的值为0.0f,用的公式和上面还不太一样,稍微区别一点。上面1.0f用的是normalied Value公式,而0.0f用的是denormalized Value公式。区别在哪呢,norm的是对于阶码不全为0000 0000 也不为 1111 1111 (我这里讲的都是对于32位机的,64位还不一样,位数不一样)的二进制数的,denom针对阶码全为0,即非常接近与0 的数。它用的公式和上面不同。太麻烦了。反正这里b的二进制码为 0(依然符号位,所以浮点数有个+0,-0) 0000 0000(denormalized value特征,阶码全零) 000 0000 0000 0000 0000 0000(尾码全为0,因为0.0f)这样的话其整形值为0 和强制转换后的整形值是一样的,所以第二个返回true。
这段内容全部参考《深入理解计算机系统》英文第二版从 137页开始
需要实例的可以随便找个值,自己求出以后,用计算器,有个程序员模式(ubuntu和win7的计算器都有),然后看位数为什么。
补充:http://blog.sina.com.cn/s/blog_5a3640220100c5ro.html这位作者写了很多实例,非常好,应急可直接拿来做参考,但是明白怎么回事还是去看书。
29. Four people are in a group
Alice says,”Exactly one of us is lying.”
Bob says, ”Exactly two of us are lying.”
Charles says, “Exactly three of us are lying.”
Dick says, “All four of us are lying.”
How many people in this group are lying?
逻辑判断。首先假设D说的是真的,即四个人都是假,那么把自己也否定了,D为false;
假设A为True,只有一个人在说假话,那么现在D已经是假,即目前认为只有D一个假,其余都为真;但是B说正好有两个说假话,C说正好有三个说假话,矛盾,A为False
假设B为TRUE,正好有两个说假话,现在A,D都已经为假,即认为B C都为真;但是C说有三个都说假话,矛盾了,B为FALSE
最后C,设为TRUE,说有三个在说假话,且现在A B D 都确定为假,所以C为真成立。即三个假一个真
30. Allen and Brenda, both have a note stuck on their forehead, with a positive integer number
written on it .Both Allen and Brenda can see each other’s number. They also know that the two
numbers have a difference of one. They are trying to figure out the number on their own forehead.
Allen first says,”I don’t know my number.”
Brenda says,” I don’t know my number either”
Then Allen says “Now, I know my number”
Brenda now says, “Yeah, I know my number also!”
What is the number of Allen and Brenda?
逻辑判断。说A,B头顶 顶俩正数。然后这俩正数差一。且A,B一番询问后,就能猜出自己头上是什么。这道题不给ABCD选项都能做出来。
俩正数,即1~无穷,如果像题上这么问一番就能问出来,A B 头顶 必顶 1 或者 2 其中之一。如果A B 谁头顶顶着个一,另一个不许要任何帮助或询问,立即就能知道自己头上是什么数,因为正数里只有2与1差1。那么现在很清楚了,A B 谁都不能顶1,且A B其中之一必顶着2,那另一个必为3.。再就是顺序,谁顶2,谁顶3。
最重要一点要明白的是,只要看到对方头上是1,不用说话立即能知道自己是2。看到对方是2,只需听对方回答一次就能判断自己头上是什么。感觉这个是关键。
如果A顶3,B顶2。A先发话,看到B头上是2,知道自己有可能是1或者3,两个判断不出来,说我不知道自己顶什么数,成立。此时就已经明了了,如果轮到B说话的时候,B能立即说出来B头上是什么,那A只会是1,因为上面那红字;如果B也判断不出来,那A就是3。现在的A就坐一边,只需要关注B是否能立即喊出自己头上是什么数。
然后就看到B继续发问,说无法判断。那经上面分析,A立即知道答案。
而如果A顶2,B顶3。好,A发话,因为看B是3,知道自己是2或者4,说判断不出来B是什么。而B看A是2,即自己只能是1或者3,并且A没有立即说出自己头顶是什么,那么自己头上只能是3。原因还是红字。