830 likes | 947 Vues
Bits, Bytes, and Integers 15-213: Introduction to Computer Systems 2 nd and 3 rd Lectures, Sep 1 and Sep 6, 2011. Instructors: Dave O’Hallaron, Greg Ganger, and Greg Kesden. Today: Bits, Bytes, and Integers. Representing information as bits Bit-level manipulations Integers
E N D
Bits, Bytes, and Integers15-213: Introduction to Computer Systems2nd and 3rd Lectures, Sep 1 and Sep 6, 2011 Instructors: Dave O’Hallaron, Greg Ganger, and Greg Kesden
Today: Bits, Bytes, and Integers • Representing information as bits • Bit-level manipulations • Integers • Representation: unsigned and signed • Conversion, casting • Expanding, truncating • Addition, negation, multiplication, shifting • Summary • Representations in memory, pointers, strings
0 1 0 3.3V 2.8V 0.5V 0.0V Binary Representations • Base 2 Number Representation • Represent 1521310 as 111011011011012 • Represent 1.2010 as 1.0011001100110011[0011]…2 • Represent 1.5213 X 104 as 1.11011011011012 X 213 • Electronic Implementation • Easy to store with bistable elements • Reliably transmitted on noisy and inaccurate wires
15 14 10 13 11 12 0011 1111 1110 0000 0001 0010 1100 1101 1011 0100 0101 1010 0110 1001 0111 1000 3 8 8 4 5 7 6 6 F 4 2 5 2 A 1 9 D B 1 9 E 7 3 0 0 C Decimal Binary Hex Encoding Byte Values • Byte = 8 bits • Binary 000000002 to 111111112 • Decimal: 010 to 25510 • Hexadecimal 0016 to FF16 • Base 16 number representation • Use characters ‘0’ to ‘9’ and ‘A’ to ‘F’ • Write FA1D37B16 in C as • 0xFA1D37B • 0xfa1d37b
Today: Bits, Bytes, and Integers • Representing information as bits • Bit-level manipulations • Integers • Representation: unsigned and signed • Conversion, casting • Expanding, truncating • Addition, negation, multiplication, shifting • Summary • Representations in memory, pointers, strings
Boolean Algebra • Developed by George Boole in 19th Century • Algebraic representation of logic • Encode “True” as 1 and “False” as 0 • And • A&B = 1 when both A=1 and B=1 • Or • A|B = 1 when either A=1 or B=1 • Not • ~A = 1 when A=0 • Exclusive-Or (Xor) • A^B = 1 when either A=1 or B=1, but not both
General Boolean Algebras • Operate on Bit Vectors • Operations applied bitwise • All of the Properties of Boolean Algebra Apply 01101001 & 01010101 01000001 01101001 | 01010101 01111101 01101001 ^ 01010101 00111100 ~ 01010101 10101010 01000001 01111101 00111100 10101010
Example: Representing & Manipulating Sets • Representation • Width w bit vector represents subsets of {0, …, w–1} • aj = 1 if j ∈ A • 01101001 { 0, 3, 5, 6 } • 76543210 • 01010101 { 0, 2, 4, 6 } • 76543210 • Operations • & Intersection 01000001 { 0, 6 } • | Union 01111101 { 0, 2, 3, 4, 5, 6 } • ^ Symmetric difference 00111100 { 2, 3, 4, 5 } • ~ Complement 10101010 { 1, 3, 5, 7 }
Bit-Level Operations in C • Operations &, |, ~, ^ Available in C • Apply to any “integral” data type • long, int, short, char, unsigned • View arguments as bit vectors • Arguments applied bit-wise • Examples (Char data type) • ~0x41 ➙ 0xBE • ~010000012 ➙ 101111102 • ~0x00 ➙ 0xFF • ~000000002 ➙ 111111112 • 0x69 & 0x55 ➙ 0x41 • 011010012 & 010101012 ➙ 010000012 • 0x69 | 0x55 ➙ 0x7D • 011010012 | 010101012➙ 011111012
Contrast: Logic Operations in C • Contrast to Logical Operators • &&, ||, ! • View 0 as “False” • Anything nonzero as “True” • Always return 0 or 1 • Early termination • Examples (char data type) • !0x41 ➙ 0x00 • !0x00 ➙ 0x01 • !!0x41 ➙ 0x01 • 0x69 && 0x55 ➙ 0x01 • 0x69 || 0x55 ➙ 0x01 • p && *p (avoids null pointer access)
Contrast: Logic Operations in C • Contrast to Logical Operators • &&, ||, ! • View 0 as “False” • Anything nonzero as “True” • Always return 0 or 1 • Early termination • Examples (char data type) • !0x41 ➙ 0x00 • !0x00 ➙ 0x01 • !!0x41 ➙ 0x01 • 0x69 && 0x55 ➙ 0x01 • 0x69 || 0x55 ➙ 0x01 • p && *p (avoids null pointer access) Watch out for && vs. & (and || vs. |)… one of the more common oopsies in C programming
Argument x Argument x Arith. >> 2 Arith. >> 2 Log. >> 2 Log. >> 2 11101000 01100010 00010000 00011000 00011000 10100010 00010000 00101000 11101000 00101000 00010000 11101000 00101000 00010000 00011000 00011000 00011000 00010000 00010000 00011000 << 3 << 3 Shift Operations • Left Shift: x << y • Shift bit-vector x left y positions • Throw away extra bits on left • Fill with 0’s on right • Right Shift: x >> y • Shift bit-vector x right y positions • Throw away extra bits on right • Logical shift • Fill with 0’s on left • Arithmetic shift • Replicate most significant bit onleft • Undefined Behavior • Shift amount < 0 or ≥ word size
Today: Bits, Bytes, and Integers • Representing information as bits • Bit-level manipulations • Integers • Representation: unsigned and signed • Conversion, casting • Expanding, truncating • Addition, negation, multiplication, shifting • Summary • Representations in memory, pointers, strings • Summary
Encoding Integers Unsigned Two’s Complement • C short 2 bytes long • Sign Bit • For 2’s complement, most significant bit indicates sign • 0 for nonnegative • 1 for negative short int x = 15213; short int y = -15213; Sign Bit
Encoding Example (Cont.) x = 15213: 00111011 01101101 y = -15213: 11000100 10010011
Unsigned Values UMin = 0 000…0 UMax = 2w – 1 111…1 Two’s Complement Values TMin = –2w–1 100…0 TMax = 2w–1 – 1 011…1 Other Values Minus 1 111…1 Numeric Ranges Values for W = 16
Values for Different Word Sizes • Observations • |TMin| = TMax + 1 • Asymmetric range • UMax = 2 * TMax + 1 • C Programming • #include<limits.h> • Declares constants, e.g., • ULONG_MAX • LONG_MAX • LONG_MIN • Values platform specific
X B2U(X) B2T(X) 0000 0 0 0001 1 1 0010 2 2 0011 3 3 0100 4 4 0101 5 5 0110 6 6 0111 7 7 1000 8 –8 1001 9 –7 1010 10 –6 1011 11 –5 1100 12 –4 1101 13 –3 1110 14 –2 1111 15 –1 Unsigned & Signed Numeric Values • Equivalence • Same encodings for nonnegative values • Uniqueness • Every bit pattern represents unique integer value • Each representable integer has unique bit encoding • Can Invert Mappings • U2B(x) = B2U-1(x) • Bit pattern for unsigned integer • T2B(x) = B2T-1(x) • Bit pattern for two’s comp integer
Today: Bits, Bytes, and Integers • Representing information as bits • Bit-level manipulations • Integers • Representation: unsigned and signed • Conversion, casting • Expanding, truncating • Addition, negation, multiplication, shifting • Summary • Representations in memory, pointers, strings
Mapping Between Signed & Unsigned • Mappings between unsigned and two’s complement numbers:keep bit representations and reinterpret Unsigned Two’s Complement T2U x ux T2B B2U X Maintain Same Bit Pattern Two’s Complement Unsigned U2T ux x U2B B2T X Maintain Same Bit Pattern
T2U U2T Mapping Signed Unsigned
= +/- 16 Mapping Signed Unsigned
+ - + + + + • • • • • • + + + + + + Relation between Signed & Unsigned Unsigned Two’s Complement T2U x ux T2B B2U X Maintain Same Bit Pattern w–1 0 ux x Large negative weight becomes Large positive weight
Conversion Visualized • 2’s Comp. Unsigned • Ordering Inversion • Negative Big Positive UMax UMax – 1 TMax+ 1 Unsigned Range TMax TMax 2’s Complement Range 0 0 –1 –2 TMin
Signed vs. Unsigned in C • Constants • By default are considered to be signed integers • Unsigned if have “U” as suffix 0U, 4294967259U • Casting • Explicit casting between signed & unsigned same as U2T and T2U inttx, ty; unsigned ux, uy; tx = (int) ux; uy = (unsigned) ty; • Implicit casting also occurs via assignments and procedure calls tx = ux; uy = ty;
Casting Surprises • Expression Evaluation • If there is a mix of unsigned and signed in single expression, signed values implicitly cast to unsigned • Including comparison operations <, >, ==, <=, >= • Examples for W = 32: TMIN = -2,147,483,648 , TMAX = 2,147,483,647 • Constant1 Constant2 Relation Evaluation 0 0U -1 0 -1 0U 2147483647 -2147483647-1 2147483647U -2147483647-1 -1 -2 (unsigned)-1 -2 2147483647 2147483648U 2147483647 (int) 2147483648U 0 0U == unsigned -1 0 < signed -1 0U > unsigned 2147483647 -2147483648 > signed 2147483647U -2147483648 < unsigned -1 -2 > signed (unsigned) -1 -2 > unsigned 2147483647 2147483648U < unsigned 2147483647 (int) 2147483648U > signed
SummaryCasting Signed ↔ Unsigned: Basic Rules • Bit pattern is maintained • But reinterpreted • Can have unexpected effects: adding or subtracting 2w • Expression containing signed and unsigned int • int is cast to unsigned!!
Today: Bits, Bytes, and Integers • Representing information as bits • Bit-level manipulations • Integers • Representation: unsigned and signed • Conversion, casting • Expanding, truncating • Addition, negation, multiplication, shifting • Summary • Representations in memory, pointers, strings
w X • • • • • • X • • • • • • w k Sign Extension • Task: • Given w-bit signed integer x • Convert it to w+k-bit integer with same value • Rule: • Make k copies of sign bit: • X = xw–1 ,…, xw–1 , xw–1 , xw–2 ,…, x0 k copies of MSB
Decimal Hex Binary 15213 x 3B 6D 00111011 01101101 15213 ix 00 00 3B 6D 00000000 00000000 00111011 01101101 -15213 y C4 93 11000100 10010011 -15213 iy FF FF C4 93 11111111 11111111 11000100 10010011 Sign Extension Example short intx = 15213; int ix = (int) x; short inty = -15213; intiy = (int) y; • Converting from smaller to larger integer data type • C automatically performs sign extension
Summary:Expanding, Truncating: Basic Rules • Expanding (e.g., short int to int) • Unsigned: zeros added • Signed: sign extension • Both yield expected result • Truncating (e.g., unsigned to unsigned short) • Unsigned/signed: bits are truncated • Result reinterpreted • Unsigned: mod operation • Signed: similar to mod • For small numbers yields expected behavour
Today: Bits, Bytes, and Integers • Representing information as bits • Bit-level manipulations • Integers • Representation: unsigned and signed • Conversion, casting • Expanding, truncating • Addition, negation, multiplication, shifting • Representations in memory, pointers, strings • Summary
• • • • • • • • • • • • Unsigned Addition u • Standard Addition Function • Ignores carry output • Implements Modular Arithmetic s = UAddw(u , v) = u + v mod 2w Operands: w bits v + True Sum: w+1 bits u + v UAddw(u , v) Discard Carry: w bits
Visualizing (Mathematical) Integer Addition • Integer Addition • 4-bit integers u, v • Compute true sum Add4(u , v) • Values increase linearly with u and v • Forms planar surface Add4(u , v) v u
2w+1 2w 0 Visualizing Unsigned Addition • Wraps Around • If true sum ≥ 2w • At most once Overflow UAdd4(u , v) True Sum Overflow v Modular Sum u
• • • • • • • • • • • • Two’s Complement Addition u • TAdd and UAdd have Identical Bit-Level Behavior • Signed vs. unsigned addition in C: int s, t, u, v; s = (int) ((unsigned) u + (unsigned) v); t = u + v • Will gives == t Operands: w bits + v True Sum: w+1 bits u + v Discard Carry: w bits TAddw(u , v)
TAdd Overflow • Functionality • True sum requires w+1 bits • Drop off MSB • Treat remaining bits as 2’s comp. integer True Sum 0 111…1 2w–1 PosOver TAdd Result 0 100…0 2w –1 011…1 0 000…0 0 000…0 1 011…1 –2w –1–1 100…0 NegOver 1 000…0 –2w
Visualizing 2’s Complement Addition • Values • 4-bit two’s comp. • Range from -8 to +7 • Wraps Around • If sum 2w–1 • Becomes negative • At most once • If sum < –2w–1 • Becomes positive • At most once NegOver TAdd4(u , v) v u PosOver
Multiplication • Goal: Computing Product of w-bit numbers x, y • Either signed or unsigned • But, exact results can be bigger than wbits • Unsigned: up to 2w bits • Result range: 0 ≤ x * y ≤ (2w – 1) 2 = 22w – 2w+1 + 1 • Two’s complement min (negative): Up to 2w-1 bits • Result range: x * y ≥ (–2w–1)*(2w–1–1) = –22w–2 + 2w–1 • Two’s complement max (positive): Up to 2w bits, but only for (TMinw)2 • Result range: x * y ≤ (–2w–1) 2 = 22w–2 • So, maintaining exact results… • would need to keep expanding word size with each product computed • is done in software, if needed • e.g., by “arbitrary precision” arithmetic packages
• • • • • • • • • • • • • • • Unsigned Multiplication in C • Standard Multiplication Function • Ignores high order w bits • Implements Modular Arithmetic UMultw(u , v) = u · v mod 2w u Operands: w bits * v u · v True Product: 2*w bits UMultw(u , v) Discard w bits: w bits
• • • • • • • • • • • • • • • Signed Multiplication in C • Standard Multiplication Function • Ignores high order w bits • Some of which are different for signed vs. unsigned multiplication • Lower bits are the same u Operands: w bits * v u · v True Product: 2*w bits TMultw(u , v) Discard w bits: w bits
• • • Power-of-2 Multiply with Shift • Operation • u << kgives u * 2k • Both signed and unsigned • Examples • u << 3 == u * 8 • u << 5 - u << 3 == u * 24 • Most machines shift and add faster than multiply • Compiler generates this code automatically k u • • • Operands: w bits * 2k 0 ••• 0 1 0 ••• 0 0 u · 2k True Product: w+k bits 0 ••• 0 0 Discard k bits: w bits UMultw(u , 2k) ••• 0 ••• 0 0 TMultw(u , 2k)
••• ••• Unsigned Power-of-2 Divide with Shift • Quotient of Unsigned by Power of 2 • u >> kgives u / 2k • Uses logical shift k u Binary Point ••• Operands: / 2k 0 ••• 0 1 0 ••• 0 0 Division: u / 2k . 0 0 ••• 0 0 ••• Result: u / 2k 0 0 ••• 0 0 •••
••• ••• Signed Power-of-2 Divide with Shift • Quotient of Signed by Power of 2 • x >> kgives x / 2k • Uses arithmetic shift • Rounds wrong direction when u < 0 k x Binary Point ••• Operands: / 2k 0 ••• 0 1 0 ••• 0 0 Division: x / 2k . 0 ••• ••• RoundDown(x/ 2k) Result: 0 ••• •••
Correct Power-of-2 Divide • Quotient of Negative Number by Power of 2 • Want x / 2k (Round Toward 0) • Compute as (x+2k-1)/ 2k • In C: (x + (1<<k)-1) >> k • Biases dividend toward 0 Case 1: No rounding k Dividend: u 1 ••• 0 ••• 0 0 +2k –1 0 ••• 0 0 1 ••• 1 1 Binary Point 1 ••• 1 ••• 1 1 Divisor: / 2k 0 ••• 0 1 0 ••• 0 0 u / 2k . 0 1 ••• 1 1 1 ••• 1 ••• 1 1 • Biasing has no effect
Correct Power-of-2 Divide (Cont.) Case 2: Rounding k Dividend: x 1 ••• ••• +2k –1 0 ••• 0 0 1 ••• 1 1 1 ••• ••• Incremented by 1 Binary Point Divisor: / 2k 0 ••• 0 1 0 ••• 0 0 x / 2k . 0 1 ••• 1 1 1 ••• ••• Incremented by 1 • Biasing adds 1 to final result
Today: Bits, Bytes, and Integers • Representing information as bits • Bit-level manipulations • Integers • Representation: unsigned and signed • Conversion, casting • Expanding, truncating • Addition, negation, multiplication, shifting • Summary • Representations in memory, pointers, strings
Arithmetic: Basic Rules • Addition: • Unsigned/signed: Normal addition followed by truncate,same operation on bit level • Unsigned: addition mod 2w • Mathematical addition + possible subtraction of 2w • Signed: modified addition mod 2w (result in proper range) • Mathematical addition + possible addition or subtraction of 2w • Multiplication: • Unsigned/signed: Normal multiplication followed by truncate, same operation on bit level • Unsigned: multiplication mod 2w • Signed: modified multiplication mod 2w (result in proper range)
Why Should I Use Unsigned? • Don’t Use Just Because Number Nonnegative • Easy to make mistakes unsigned i; for (i = cnt-2; i >= 0; i--) a[i] += a[i+1]; • Can be very subtle #define DELTA sizeof(int) inti; for (i = CNT; i-DELTA >= 0; i-= DELTA) . . . • Do Use When Performing Modular Arithmetic • Multiprecision arithmetic • Do Use When Using Bits to Represent Sets • Logical right shift, no sign extension