Week 07 Tutorial Questions
Objectives
 introduce the two'scomplement method of storing negative integers in binary
 introduce the IEEE754 standard for representing floatingpoint numbers in binary as a more complex binary representation of data
 practise using the bitwise operators in C to manipulate binary representations of data

On a machine with 16bit
int
s, the C expression(30000 + 30000)
yields a negative result.Why the negative result? How can you make it produce the correct result?

Assume that the following hexadecimal values are 16bit twoscomplement. Convert each to the corresponding decimal value.

0x0013

0x0444

0x1234

0xffff

0x8000


Give a representation for each of the following decimal values in 16bit twoscomplement bitstrings. Show the value in binary, octal and hexadecimal.
 1
 100
 1000
 10000
 100000
 5
 100

What decimal numbers do the following singleprecision IEEE 754encoded bitstrings represent?

0 00000000 00000000000000000000000

1 00000000 00000000000000000000000

0 01111111 10000000000000000000000

0 01111110 00000000000000000000000

0 01111110 11111111111111111111111

0 10000000 01100000000000000000000

0 10010100 10000000000000000000000

0 01101110 10100000101000001010000
Each of the above is a single 32bit bitstring, but partitioned to show the sign, exponent and fraction parts.


Convert the following decimal numbers into IEEE 754encoded bitstrings:
 2.5
 0.375
 27.0
 100.0

Write a C function,
six_middle_bits
, which, given auint32_t
, extracts and returns the middle six bits.
Revision questions
The following questions are primarily intended for revision, either this week or later in session.
Your tutor may still choose to cover some of these questions, time permitting.

Draw diagrams to show the difference between the following two data structures:
struct { int a; float b; } x1; union { int a; float b; } x2;
If
x1
was located at&x1 == 0x1000
andx2
was located at&x2 == 0x2000
, what would be the values of&x1.a
,&x1.b
,&x2.a
, and&x2.b
? 
How large (#bytes) is each of the following C
union
s?
union { int a; int b; } u1;

union { unsigned short a; char b; } u2;

union { int a; char b[12]; } u3;

union { int a; char b[14]; } u4;

union { unsigned int a; int b; struct { int x; int y; } c; } u5;
You may assume
sizeof(char)
== 1,sizeof(short)
== 2,sizeof(int)
== 4. 

Consider the following C
union
union _all { int ival; char cval; char sval[4]; float fval; unsigned int uval; };
If we define a variable
union _all var;
and assign the following valuevar.uval = 0x00313233;
, then what will each of the following printf(3)s produce:
printf("%x\n", var.uval);

printf("%d\n", var.ival);

printf("%c\n", var.cval);

printf("%s\n", var.sval);

printf("%f\n", var.fval);

printf("%e\n", var.fval);
You can assume that bytes are arranged from righttoleft in increasing address order.
