CSAPP家庭作业(第二章)

一万年来谁著史,三千里外欲封侯。这篇文章主要讲述CSAPP家庭作业(第二章)相关的知识,希望能为你提供帮助。
2.55(*)

#include < stdio.h> typedef unsigned char *byte_pointer; void show_bytes(byte_pointer start,size_t len){ size_t i; for(i=0; i< len; i++) printf("%.2x",start[i]); printf("\\n"); }void show_int(int x){ show_bytes((byte_pointer)& x,sizeof(int)); }void show_float(float x){ show_bytes((byte_pointer)& x,sizeof(float)); }void show_pointer(void *x){ show_bytes((byte_pointer)& x,sizeof(void *)); }int main(){ int ival=12345; float fval=(float)ival; int *pval=& ival; show_int(ival); show_float(fval); show_pointer(pval); }

编译并运行示例代码:
CSAPP家庭作业(第二章)

文章图片

答:由此可见我的机器是采用低位先输出的小端法机器。
 
2.56 -2.57 :略
 
2.58(**)
1 #include < stdio.h> 2 3 typedef unsigned char *byte_pointer; 4 5 6 int is_little_endian(){ 7int val=0x00000001; 8byte_pointer valp=(byte_pointer)& val; 9int temp; 10temp = valp[0]; 11if(temp==1) 12return 1; 13else 14return 0; 15 } 16 17 void main(){ 18is_little_endian(); 19 }

 
2.59(**)
C表达式:(x & 0xFF)|(y & ~0xFF)
【CSAPP家庭作业(第二章)】 
2.60(**)
1 #include < stdio.h> 2 3 unsigned replace_byte(unsigned x,int i,unsigned char b){ 4return (x& (~(0xFF< < (i< < 3))))|(b< < (i< < 3)); 5 } 6 7 int main(){ 8printf("%X\\n",replace_byte(0x12345678,2,0xAB)); 9 }

(PS:这里要求不能用乘法,为了实现8*i,也是用移位来实现乘法,其他的没什么难点。)
 
2.61(**)
A:!~x;
B:!x;
C:!((~x)& 0xFF);
D:!(x> > ((sizeof(int)-1)< < 3))
 
2.62(***)
1 #include < stdio.h> 2 3 int int_shifts_are_arithmetic(){ 4return !~(-1> > (sizeof(int)< < 3)); 5 } 6 7 int main(){ 8printf("%d\\n",int_shifts_are_arithmetic()); 9 }

这一题我没有用==和!=运算,其实是可以用的。
 
2.63(***)
 
1 unsigned srl(unsigned x,int k){ 2unsigned xsra=(int)x> > k; 3int w=8*sizeof(int); 4unsigned z=2< < (w-k-1); 5return xsra& (z-1); 6 } 7 8 int sra(int x,int k){ 9int xsrl=(unsigned)x> > k; 10int w=8*sizeof(int); 11unsigned z=1< < (w-k-1); 12unsigned mask=z-1; 13unsigned right=mask& xsrl; 14unsigned left = ~mask& (~(z& xsrl)+z); 15return left|right; 16 }

 

    推荐阅读