分配给你的任务是:为一个使用补码运算和算术右移的机器编写一个具有如下原型的函数:
接题目:
/* Declaration of data type where 4 bytes are packed
into an unsigned */
typedef unsigned packed_t;
/* Extract byte from word. Return as signed integer */
int xbyte(packed_t word, int bytenum);
也就是说,函数会抽取出指定的字节,再把它符号扩展为一个32位int。
你的前辈(因为水平不够高而被解雇了)编写了下面的代码:
/* Failed attempt at xbyte */
int xbyte(packed_t word, int bytenum)
{
return (word >> (bytenum << 3)) & 0xFF;
}
开始作答 官方答案(已验证)
题目的意思是将原来有符号数(33 22 11 00,一共4个字节),现要将每一个字节通过符号扩展都封装成一个32位unsigned数。
A.不管bytenum是正数还是负数,都做了零扩展(和官方答案不同)。
B.这里用负数验证的话,会得到-1就是取出了最高位的第一个字节。
#include <stdio.h>
#include <assert.h>
/* Declaration of data type where 4 bytes are packed
into an unsigned */
typedef unsigned packed_t;
int xbyte(packed_t word, int bytenum) {
/** pay attention when byte we want is negetive *
* Assume sizeof(unsigned) is 4
* first shift left 8 * (4 - 1 - bytenum)
* then arthemetic shift right 8
* (4 - 1) reserve signficant bit */
int size = sizeof(unsigned);
int shift_left_val = (size - 1 - bytenum) << 3;
int shift_right_val = (size - 1) << 3;
return (int)word << shift_left_val >> shift_right_val;
}
int main(int argc, char* argv[]) {
assert(xbyte(0xAABBCCDD, 1) == 0xFFFFFFCC);
assert(xbyte(0x00112233, 2) == 0x11);
return 0;
}