> For the complete documentation index, see [llms.txt](https://valineliu.gitbook.io/deuterium-wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://valineliu.gitbook.io/deuterium-wiki/reading/cs-jing-dian-shu-ji/csapp-3e-homework-solution/2.-representing-and-manipulating-information/2.71-xbyte.md).

# 2.71 Xbyte

★

**Problem**:

You just started working for a company that is implementing a set of procedures to operate on a data structure where 4 signed bytes are packed into a 32-bit `unsigned`. Bytes within the word are numbered from 0 (least significant) to 3 (most significant). You have been assigned the task of implementinig a function for a machine using two's-complement arithmetic and arithmetic right shifts with the following prototype:

```c
/* 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);
```

That is, the function will extract the designated byte and sign extend it to be a 32-bit `int`.

Your predecessor(who was fired for incompetence) wrote the following code:

```c
/* Failed attempt at xbyte */
int xbyte(packed_t word, int bytenum) {
    return (word >> (bytenum << 3)) & 0xFF;
}
```

A. What is wrong with this code?

This code can't extract negative number from word.

B. Give a correct implementation of the function that uses only left and right shifts, along with one subtraction.

Code:

```c
#include <stdio.h>
#include <assert.h>

typedef unsigned packed_t;

int xbyte(packed_t word, int bytenum) {
    int size = sizeof(unsigned);
    int leftshifts = (size - 1 - bytenum) << 3;
    int rightshifts = (size - 1) << 3;
    return (int)(word << leftshifts) >> rightshifts;
}

int main() {
    assert(xbyte(0x88888888, 1)==0xFFFFFF88);
    assert(xbyte(0x12345678, 2)==0x00000034);
    return 0;
}
```
