#include<stdio.h>intfits_bits(int x,int n){
int w=sizeof(int)<<3;return x == x<<(w-n)>>(w-n);}intmain(){
printf("%d\n",fits_bits(114514,19));}
P71
A 这个函数不能从word中提取一个负值的byte。
B
#include<stdio.h>typedefunsigned packed_t;intxbyte(packed_t word,int bytenum){
int w =sizeof(unsigned);int left =(w-bytenum-1)<<3;int right =(w-1)<<3;return(int)(word<<left>>right);}intmain(){
printf("%d\n",xbyte(-114514,0));}
P72
A sizeof返回的值类型是unsigned,所以maxbytes-sizeof(val)的值也是unsigned类型,大于等于0恒成立。
B
#include<stdio.h>voidcopy_int(int val,void* buf,int maxbytes){
if(maxbytes-(int)sizeof(val)>=0)memcpy(buf,(void*)&val,sizeof(val));}intmain(){
int max =114;void* buff =malloc(max);copy_int(514,&buff,114);}
P73
#include<stdio.h>#include<limits.h>intsaturating_add(int x,int y){
int sum = x+y;int mask = INT_MIN;int pos_over =!(x&mask)&&!(y&mask)&&(sum&mask);int neg_over =(x&mask)&&(y&mask)&&!(sum&mask);(pos_over&&(sum=INT_MAX