220 likes | 330 Views
Homework. Homework Continue Reading K&R Chapter 2 Questions?. Converting Decimal to Binary. Divide the decimal number successively by 2 and write down the remainder in binary form: e.g. 117 10 117 1 LSB (after divide by 2, remainder =1)
E N D
Homework • Homework • Continue Reading K&R Chapter 2 • Questions?
Converting Decimal to Binary • Divide the decimal number successively by 2 and write down the remainder in binary form: e.g. 11710 117 1 LSB (after divide by 2, remainder =1) 58 0 (after divide by 2, remainder =0) 29 1 (after divide by 2, remainder =1) 14 0 (after divide by 2, remainder =0) 7 1 (after divide by 2, remainder =1) 3 1 (after divide by 2, remainder =1) 1 1 (after divide by 2, remainder =1) 0 0 MSB • Read UP and add any leading 0’s: 01110101 odd even
Converting Decimal to Hex • Method 1: • Convert the decimal number to binary and group the binary digits in groups of 4 e.g. 11710 0111 01012 7516 • Method 2 (shown in HW3): • Divide the decimal number successively by 16 and write down the remainder in hex form: 117 5 LSB (after divide by 16, remainder =5) 7 7 MSB (after divide by 16, remainder =7) • Read UP and add any leading 0’s: 0x75
Converting Binary to Decimal • Treat each bit position n that contains a one as adding 2n to the value. Ignore zeros because they can’t add anything to the value. Bit 0 LSB 1 1 (= 20) Bit 1 0 0 Bit 2 1 4 (= 22) Bit 3 1 8 (= 23) Bit 4 0 0 Bit 5 1 32 (= 25) Bit 6 0 0 Bit 7 MSB 0 0 Total 45
Converting Hex to Decimal • Treat each digit n as adding 16n to the value. Ignore zeros because they can’t add anything to the value. Digit 0 LSB 0 0 Digit 1 2 32 (= 2 * 161) Digit 2 b 2816 (= 11 * 162) Digit 3 0 0 Digit 4 0 0 Digit 5 1 1048576 (= 1 * 165) Digit 6 0 0 Digit 7 MSB 0 0 Total 1051424
Base for Integer Constants • Designating the base for an integer constant • If constant begins with either: 0x It is Hex with a-f as Hex digits 0X It is Hex with A-F as Hex digits • Otherwise, if constant begins with 0 It is Octal • Otherwise, it is decimal
Base for Character Constants • Designating the base for a character constant • If constant begins with either: ‘\x It is Hex with 0-9 and a-f as Hex digits ‘\X It is Hex with 0-9 and A-F as Hex digits • Otherwise, if constant begins with ‘\0 It is Octal • Otherwise, it is the ASCII code for a character ‘a’
Constants • Character and Integer Constants are Signed! • Sign bit (MSB) not set ‘\x55’ equals an 8-bit quantity 01010101 when casted to an int, it equals 0000 … 01010101 0x55 equals a 32-bit quantity 0000 … 01010101 • Sign bit (MSB) set ‘\xaa’ equals an 8-bit quantity 10101010 when casted to an int, it equals 1111 … 10101010 0xaa equals a 32 bit quantity 0000 … 10101010 • Note: None of the ASCII codes (x00 - x7f) have sign bit set!
Signed (Default) Behavior • Careful mixing modes when initializing variables! int i; (signed behavior is default) char c; (signed behavior is default) i = 0xaa; (== 000000aa) as intended i = ‘\xaa’; (== ffff ffaa) sign extends! c = ‘\xaa’; (== aa) as intended i = c; (==ffff ffaa) sign extends! Sign Bit Extension char 1 0101010 int 11111111 11111111 11111111 1 0101010
Unsigned Behavior • Careful mixing modes when initializing variables! unsigned int i; (must specify unsigned if wanted) unsigned char c; (must specify unsigned if wanted) i = 0xaa; (== 000000aa) as intended i = ‘\xaa’; (== ffffffaa) char sign extends! c = ‘\xaa’; (== aa) as intended i = c; (==0000 00aa) char sign not extended! Sign Bit Extension char 1 0101010 int 11111111 11111111 11111111 1 0101010
Example to illustrate signed/unsigned types void copy_characters(void){ char ch; while ((ch =getchar()) != EOF) putchar(ch); } What happens if ch is defined as unsigned char? Is this true? If getchar() == EOF, is this true? No yes Changing the declaration of ch into int ch; makes it work.
One’s ComplementTwo’s Complement • One’s Complement Character Arithmetic ~ is the one’s complement operator ~ flips the value of each bit in the data All zeroes become one, All ones become zero ~ ‘\xaa’ == ‘\x55’ ~10101010 == 01010101 • Number anded with its one’s complement = 0 10101010 & 01010101 00000000
One’s ComplementTwo’s Complement • Two’s Complement Character Arithmetic - is the two’s complement operator • flips the value of each bit in the data and adds 1 It creates the negative of the data value - ‘\x55’ == ‘\xab’ - 01010101 == 10101011 • Number added to its two’s complement = 0 01010101 + 10101011 (1) 00000000 (carry out of MSB is dropped)
Two Special Case Values • char 0 (or zero of any length) -00000000 = 11111111 + 1 = 00000000 • char -27 (or -2n-1 for any length = n) -10000000 = 01111111 + 1 = 10000000
Bit Manipulation • Bitwise Operators: ~ one’s complement (unary not) & and | or ^ xor (exclusive or) << left shift >> right shift • Lots of possible Exam questions here!
Binary Logic Tables AND 0 1 OR 0 1 0 0 0 0 0 1 NOT 1 0 1 1 1 1 0 1 1 0 XOR 0 1 ADD 0 1 0 0 1 0 0 1 0 Carry 1 1 1 0 1 1 Operands Results
Bit Manipulation unsigned char n = ‘\xa6’; n 10100110 ~n 01011001 (1s complement: flip bits) n | ‘\x65’ 10100110 turn on bit in result if | 01100101 on in either operand 11100111
Bit Manipulations n & ‘\x65’ 10100110 turn on bit in result if | 01100101 on in both operands 00100100 n ^ ‘\x65’ 10100110 turn on bit in result if | 01100101 on in exactly 1 operand 11000011
Bit Manipulations n = ‘\x18’; 00011000 (Remember n is unsigned) n << 1 00110000 shift 1 to left (like times 2) n << 2 01100000 shift 2 to left (like times 4) n << 4 10000000 shift 4 to left (bits disappear off left end) n >> 2 00000110 shift 2 to right (like / 4) n >> 4 00000001 shift 4 to right (bits disappear off right end) Unsigned Right Shift 0
Bit Manipulations • Right shift result may be different if n is signed! • If value of n has sign bit = 0, works same as last slide • If value of n has sign bit = 1, works differently!! char n = ‘\xa5’; (default is signed) n 10100101 (sign bit is set) n >>2 11101001 (bring in 1’s from left) • Bringing in extra copies of the sign bit on the left is also called "sign extension" Signed Right Shift
Bit Manipulations • For signed variable, negative value shifted right by 2 or 4 is still a negative value ‘\xa5’ =10100101 ‘\xa5’ >> 2 = 11101001 = ‘\xe9’ • Same result as divide by 4 (22 = 4) • But, this is not true on all machines • See K&R pg. 49, lines 8-10.
Bit Manipulations • When dividing a negative value • Different rounding rules than for positive value • Remainder must be negative - not positive • Note that (-1)/2 = -1 • Note that -(1/2) = 0