37
Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

  • View
    236

  • Download
    3

Embed Size (px)

Citation preview

Page 1: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Chapter 6

Primitive Data Types:

Numbers

Strings

Ordinal Types

Pointers

Page 2: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–2

Data Types

• Data types provide a context for operations– the + operator works differently for different

types of numbers (and for strings)

• Types also limit the operations that can be performed to those that make sense– dividing strings or characters doesn't make

sense

Page 3: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–3

Type Systems provide

• A mechanism for defining types and associating them with language constructs– named constants, variables, record fields,

parameters, …

• A set of rules for – type equivalence– type compatibility– type inference

Page 4: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–4

Ways to think about types

• Denotational – a type is a set of values

• Constructive– types are built-in or created from existing types

• Abstraction-based– a type is an interface consisting of a set of

operations

Page 5: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–5

Definitions

• data type– collection of data objects

– a set of predefined operations

• descriptor : collection of attributes for a variable• data object : instance of a user-defined (abstract

data) type

Page 6: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–6

Ways of classifying types

• Simple vs. compound• Built-in vs. user-defined

– boolean, character, integer, floating point– enumeration types, classes, records/structures

• discrete (enumerable) or not– integer, boolean, character, enumeration,

subrange– real, compound

Page 7: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–7

Data Types

• Primitive– not defined in terms of other data types

– defined in the language

– often reflect the hardware

• Structured – built out of other types

Page 8: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–8

Integer Types

• Usually use hardware representation

• May have several ranges – Java’s signed integer sizes: byte, short, int, long

– C/C++ have unsigned versions of the same types

– Scripting languages often just have one integer type

– Python has an integer type and a long integer which can get as big as it needs to.

Page 9: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–9

Representing Integers

• Can convert positive integers to base 2

• How do you handle negative numbers with only 0s and 1s?– Sign bit

– Ones complement

– Twos complement - this is the one that is used

Page 10: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–10

Representing negative integers

• Sign bit

• Ones complement

Page 11: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–11

Twos Complement

• To get the binary representation, take the complement and add 1

Page 12: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–12

Floating Point Types

• Model real numbers– only an approximation due to round-off error

• For scientific use support at least two floating-point types (e.g., float and double; sometimes more

• Usually based on hardware

• IEEE Floating-Point Standard 754– 32 and 64 bit standards

Page 13: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–13

Representing Real Numbers

• We can convert the decimal number to base 2 just as we did for integers

• How do we represent the decimal point?– fixed number of bits for the whole and

fractional parts severely limits the range of values we can represent

• Use a representation similar to scientific notation

Page 14: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–14

IEEE Floating Point Representation

• Normalize the number – one non-zero bit before decimal point

• Use one bit to represent the sign (1 for negative)• Use a fixed number of bits for the exponent which is offset

to allow for negative exponents– Exponent = exponent + offset

• (-1)sign 1.Fraction x 2Exponent

Page 15: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–15

Floating Point Types

• C, C++ and Java have two floating point types– float

– double

• Most scripting languages have one floating point type– Python's floating point type is equivalent to a C double

• Some scripting languages only have one kind of number which is a floating point type

Page 16: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–16

Fixed Point Types (Decimal)

• For business applications (money) round-off errors are not acceptable– Essential to COBOL

– .NET languages have a decimal data type

• Store a fixed number of decimal digits

• Operations generally have to be defined in software

• Advantage: accuracy

• Disadvantages: limited range, wastes memory

Page 17: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–17

C# decimal Type

• 128-bit representation

• Range: 1.0x10-28 to 7.9x1028

• Precision: representation is exact to 28 or 29 decimal places (depending on size of number)– no roundoff error

Page 18: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–18

Other Primitive Data Types:• Boolean

– Range of values: two elements, one for “true” and one for “false”

– Could be implemented as bits, but often as bytes

• Character– Stored as numeric codings– Most commonly used coding: ASCII– An alternative, 16-bit coding: Unicode

• Complex (Fortran, Scheme, Python)• Rational (Scheme)

Page 19: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–19

Character Strings

• Values are sequences of characters

• Operations:– Assignment and copying

– Comparison (=, >, etc.)

– Catenation

– Substring reference

– Pattern matching

• Design issues:– Is it a primitive type or just a special kind of array?

– Should the length of strings be static or dynamic?

Page 20: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–20

Character String Implementations

• C and C++– Not primitive

– Use char arrays and a library of functions that provide operations

• SNOBOL4 (a string manipulation language)– Primitive

– Many operations, including elaborate pattern matching

• Java– String class

Page 21: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–21

String Length Options

• Static: COBOL, Java’s String class

• Limited Dynamic Length: C and C++– a special character is used to indicate the end of

a string’s characters

• Dynamic (no maximum): SNOBOL4, Perl, JavaScript

• Ada supports all three string length options

Page 22: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–22

String Implementation

• Static length: compile-time descriptor

• Limited dynamic length: may need run-time descriptor

• not in C and C++

• Dynamic length: needs run-time descriptor; – allocation/deallocation is main

implementation issue

Page 23: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–23

User-Defined Ordinal Types• ordinal type : range of possible values corresponds

to set of positive integers

• Primitive ordinal types– integer– char– boolean

• User-defined ordinal types– enumeration types– subrange types

Page 24: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–24

Enumeration Types

• All possible values, which are named constants, are provided in the definition

• C exampleenum days {mon, tue, wed, thu, fri, sat, sun};

• Design issues– duplication of names

– coercion rules

Page 25: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–25

enums in C (and C++)• To define an enumerated type in C

enum weekday {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday};

enum weekday today = Tuesday;

• Use typedef to give the type a nametypedef enum weekday {Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday} weekday;

weekday today = Tuesday;

• By default, values are consecutive starting from 0.– You can explicitly assign values

Enum months {January=1, February, …};

Page 26: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–26

Enumerations in Java 1.5

• An enum is a new class which extends java.lang.Enum and implements Comparable– Get type safety and compile-time checking

– Implicitly public, static and final

– Can use either == or equals to compare

– toString and valueOf are overridden to make input and output easier

Page 27: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–27

Java enum Example• Defining an enum type

enum Season {WINTER, SPRING, SUMMER, FALL};

• Declaring an enum variableSeason season = Season.WINTER;

• toString() and name() give you the string representation of the name// println calls toString(), prints WINTER

System.out.println( season);

// name()returns WINTER

String name = season.name();

Page 28: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–28

Java enum Example• valueOf lets you convert a String to an enum

Season s = valueOf(“SPRING”);

• the ordinal() method returns the position of a particular value in the list of names int n = s.ordinal()// returns 1

• the static member values() gives you an iterable list of the enum valuesfor (Season s : Seasons.values()) {…}

Page 29: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–29

Subrange Types• A contiguous subsequence of an ordinal type

– Example: 12..18 is a subrange of integer type

• Ada’s designtype Days is (mon, tue, wed, thu, fri, sat, sun);

subtype Weekdays is Days range mon..fri;subtype Index is Integer range 1..100;

Day1: Days;Day2: Weekday;Day2 := Day1;

Page 30: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–30

Implementation of User-Defined Ordinal Types

• Enumeration types are implemented as integers

• Subrange types are implemented like the parent types – code inserted (by the compiler) to restrict

assignments to subrange variables

Page 31: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–31

Pointer and Reference Types

• A pointer is a variable whose value is an address– range of values that consists of memory addresses plus

a special value, nil (or null or NULL)

• Provide the power of indirect addressing

• Provide a way to manage dynamic memory

• A pointer can be used to access a location in the area where storage is dynamically created (usually called a heap)

• Generally represented as a single number

Page 32: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–32

Pointer Operations• Two fundamental operations: assignment

and dereferencing• Assignment is used to set a pointer

variable’s value to some useful address• Dereferencing yields the value stored at the

location represented by the pointer’s value– Dereferencing can be explicit or implicit– C++ uses an explicit operation via *j = *ptrsets j to the value located at ptr

Page 33: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–33

Pointer Operations Illustrated

assignment

ptr = &j

allocation

ptr = (int*)malloc(

sizeof( int))

Dereferencing a pointer j = *ptr

Page 34: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–34

Pointer Problems

• Dangling pointers (dangerous)– A pointer points to a

heap-dynamic variable that has been de-allocated

• Garbage– An allocated heap-

dynamic variable that is no longer accessible to the user program

Page 35: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–35

Pointers in C and C++• Extremely flexible but must be used with care• Pointers can point at any variable regardless of

when it was allocated• Used for dynamic storage management and

addressing• Pointer arithmetic is possible• Explicit dereferencing and address-of operators• void * gives a generic pointer

– can point to any type – cannot be de-referenced but can be assigned to

a pointer of a different type

Page 36: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–36

Reference Types

• C++ includes a special kind of pointer type called a reference type that is used primarily for formal parameters– Advantages of both pass-by-reference and pass-by-

value

• Java extends C++’s reference variables and allows them to replace pointers entirely– References refer to objects (including arrays) only

• C# includes both the references of Java and the pointers of C++

Page 37: Chapter 6 Primitive Data Types: Numbers Strings Ordinal Types Pointers

Copyright © 2007 Addison-Wesley. All rights reserved. 1–37

Evaluation of Pointers

• Dangling pointers and dangling objects are problems as is heap management

• Pointers are like goto's--they widen the range of cells that can be accessed by a variable

• Pointers or references are necessary for dynamic data structures--so we can't design a language without them