====== 2. Data representation in memory and real numbers ====== * for lecturer: [[..:..:..:internal:tutorials:02:start|cvičení 2]] ===== Exercise outline ===== - basic data types (integer number) storage in computer memory, program in C - integer representation, addition, subtraction, multiplication, division - real number represetation (in IEEE 754) ===== What should I repeat before the first exercise ===== - binary representation and hexadecimal numbers - C language syntax - terms little and big endian - the second complement code - logic operations (and, or, invert, rotation, ...) - two's complement code and IEEE 754. - to understand the program from the last class. ===== What shall we do on the first exercise ===== The exercise will be based on following C code. It prints number representation in computer memory. We shall modify the code during the class. #include #define PRINT_MEM(a) print_mem((unsigned char*)&(a), sizeof(a)) void print_mem(unsigned char *ptr, int size) { int i; printf("address = 0x%08lx\n", (long unsigned int)ptr); for (i = 0; i < size; i++) { printf("0x%02x ", *(ptr+i)); } printf("\n"); } int main() { unsigned int unsig = 5; int sig = -5; printf("value = %d\n", unsig); PRINT_MEM(unsig); printf("\nvalue = %d\n", sig); PRINT_MEM(sig); return 0; } To compile the program: gcc -Wall -ansi -pedantic ./program.c Python language alternative #!/usr/bin/python3 import struct a = 1234.56789 b = -11.1111111111111111111111 c = a + b buf = struct.pack('f', c) print ('C float BE:' + ' '.join(["{0:02x}".format(b) for b in buf])) print ('C float BE:' + str(struct.unpack('>f', buf)[0])) buf = struct.pack('d', c) print ('C double BE:' + ' '.join(["{0:02x}".format(b) for b in buf])) print ('C double BE:' + str(struct.unpack('>d', buf)[0])) See Python struct module for more [[https://docs.python.org/3/library/struct.html|struct — Interpret bytes as packed binary data]]. ===== Tasks ===== - Compile and execute program above * Explain output of the program * Alter the code to print representation of other data types (float, char, double, long, etc...) * Alter the code to print numbers and their representation between -16...15. * Modify the program to add and subtract integer numbers and print arguments and results (in "normal" form and computer representation). * Try to add and subtract negative and positive numbers. Try to cause integer overflow and underflow. - Integer addition and subtraction in two's complement representation * add and subtract two integer numbers. For example 5+(-6) and 5-(-6). * repeat the operations with different numbers and check your results with the computer program from the first exercise. * When the underflow and overflow can happen? How can we detect, that it had occured? - Integer multiplication * multiply two integers, For example 7*6. * is there any difference when multiplying negative numbers? (e.g. -7*6, (-7)*(-6), etc...) * show how to speed-up the multiplier? (use many adders instead repetitively using one). - Integer division * divide integers 42/7, 43/7 * does the algorithm change when we use negative numbers? - Real number representation (IEEE 754) * binary representation of real numbers (float - 32bit, double - 64bit) * show binary representation of -0.75. Check your result with program from the last exercise. * find decimal number for float binary number 0xC0A00000 in IEEE754. * explain who to add numbers 9.999*10^1 and 1.1610*10^(-1) in decimal representation. Assume that it is possible to store only 4 digits in mantisa and 2 digits in exponent. * Hint: 1) align numbers 2) addition 3) normalization 4) round numbers. * in binary representation add 0.5 and -0.4375 * in decimal representation show multiplication of 1.110*10^10 * 9.200*10^(-5) * in binary representation multiply 0.5 and -0.4375 ===== Usefull links ===== * [ [[http://www2.its.strath.ac.uk/courses/c/|http://www2.its.strath.ac.uk/courses/c/]] ] - (Short) Introduction to C language * [ [[http://www.gnu.org/software/libc/manual/html_node/Formatted-Output.html|http://www.gnu.org/software/libc/manual/html_node/Formatted-Output.html]] ] - **printf** function documentation. The printf is used for formated output. * [[https://bootlin.com/doc/legacy/command-line/command_memento.pdf|Basic command-line operations for Unix and GNU/Linux systems]] on [[https://bootlin.com/|Bootlin]] * Description of IEEE 754 numbers representation on [[https://en.wikipedia.org/wiki/IEEE_754|Wikipedii]]