CSC 331
Programming Languages
Data Types
Lecture 7 – Data Types CSC 331 1
Data Types
• What is a data type?
A name with certain attributes:
– The values that can be stored, the internal representation,
the operations, …
• A data type is a set of values
• e.g., int in Java:
int x;
xIntegers= [-2147483648, 2147483647]
• A data type is also a set of operations on the values
Lecture 7 – Data Types 2
Why are data types important?
• Example: z = x / y; (Java)
– int x, y; x=5; y=2;
• Integer division, x/y results in 2.
• int z: z = 2;
• double z: z=2.0;
– double x, y; x=5; y=2;
• floating-point division, x/y results in 2.5
• int z: wrong!
• double z: z=2.5;
Lecture 7 – Data Types CSC 331 3
Java Types
Primitive Reference
boolean Numeric Array class interface
Type structure
Integral Floating point of Java
char float
byte double
short
int
long
Lecture 7 – Data Types CSC 331 4
C Types
Basic Derived
void Numeric Pointer Array Function struct union
Integral Floating
float
Type structure
double
(signed) enum long double of C
(unsigned)
char
int
short int
long int
Lecture 7 – Data Types CSC 331 5
Simple Data Types
• No internal structure:
e.g., integer, double, character, and boolean.
• Often directly supported in hardware.
– machine dependency
• Most predefined types are simple types.
– Exceptions: String in Java.
• Some simple types are not predefined
• Enumerated types
• Subrange types
Lecture 7 – Data Types CSC 331 6
Enumerated Types
Ordered set, whose elements are named and listed explicitly.
• Examples:
enum Color_Type {Red, Green, Blue}; ( C )
type Color_Type is (Red, Green, Blue); ( Ada )
datatype Color_Type = Red | Green | Blue; ( ML )
• Operations: ?
Successor and predecessor
Lecture 7 – Data Types CSC 331 7
Ada Example
type Color_Type is (Red, Green, Blue);
x : Color_Type := Green;
x : Color_Type’Succ(x);
x : Color_Type’Pred(x);
put(x); -- prints GREEN
• No assumptions about the internal representation of
values
• Print the value name itself
8
Pascal Example
type
cardsuit = (club, diamond, heart, spade);
card = record
suit: cardsuit;
value: 1 .. 13;
end;
var
hand: array [ 1 .. 13 ] of card;
• Succ(diamond) = heart; Pred(spade) = heart;
• club < heart; is true.
• for acard := club to heart do
9
C Example
#include <stdio.h>
enum Color {Red, Green, Blue};
enum Courses {CSE1111=1, CSE3302=3, CSE3310=3, CSE5555=4};
main() {
enum Color x = Green;
enum Courses c = CSE3302;
x++;
printf("%d\n“,x);
printf("%d\n",Blue+1);
printf("%d\n",c);
return 0;
}
• Enum in C is simply int
• Can customize the values
10
Java Example
public enum Planet { MERCURY (2.4397e6), EARTH (6.37814e6);
private final double radius; // in meters
Planet(double radius) {this.radius = radius; }
private double radius() { return radius; }
public static void main(String[] args) {
for (Planet p : Planet.values())
System.out.printf(“The radius of %s is %f\n", p, p.radius());
}
}
java.util.Enumeration has different meaning
for (Enumeration e = v.elements() ; e.hasMoreElements() ;)
System.out.println(e.nextElement());
Lecture 7 – Data Types 11
Evaluation of Enumeration Types
• Efficiency – e.g., compiler can select and use a compact
efficient representation (e.g., small integers)
• Readability -- e.g. no need to code a color as a number
• Maintainability – e.g., adding a new color doesn’t require
updating hard-coded constants.
• Reliability -- e.g. compiler can check operations and ranges of
value.
Courtesy of Charles Nicholas at UMBC
Lecture 7 – Data Types 12
C Example for Maintainability
enum Color {White, Green, Blue, Black};
enum Color {White, Yellow, Green, Blue, Black};
main(){
enum Color x = Black;
int i = x;
while (i >= White){
if (i < Green)
printf(“this is a light color!\n”);
i--;
}
}
What if no enumeration?
if (i < 1) printf(“this is a light color!\n”);
Has to be changed to:
if (i < 2) printf(“this is a light color!\n”);
Lecture 7 – Data Types 13
Ada Example for Reliability
type DAY is (MON, TUE, WED, THU, FRI, SAT, SUN);
type DIRECTION is (NORTH, EAST, SOUTH, WEST);
GOAL : DIRECTION;
TODAY : DAY;
START : DAY;
TODAY := MON;
GOAL := WEST;
START := TODAY;
TODAY := WEST; -- Illegal: WEST is not a DAY value
TODAY := 5; -- Illegal: 5 is not a DAY value
TODAY := TODAY + START; -- Illegal: "+" is not defined for DAYS
Lecture 7 – Data Types 14
Subrange Types
Contiguous subsets of simple types, with a least and greatest element.
• Example:
type Digit_Type is range 0..9; ( Ada)
• Not available in C,C++,Java. Need to use something like:
byte digit; //-128..127
...
if (digit>9 || digit <0) throw new DigitException();
• defined over ordinal types:
– ordered, every value has a next/previous element
• E.g., integer, enumerations, and subrange itself
Lecture 7 – Data Types CSC 331 15
Type constructors: Defining New Types
• Type constructors as set operations:
– Cartesian product
– Union
– Subset
– Functions (Arrays)
• Some type constructors do not correspond to set operations
(e.g., pointers)
• Some set operators don’t have corresponding type
constructors (e.g., intersection)
Lecture 7 – Data Types CSC 331 16
Cartesian Product
• Ordered Pairs of elements from U and V
U V = {(u, v) | uU and vV}
• Operations:
– projection
p1: U V → U; p2 : U V → V
p1((u,v))=u; p2((u,v))=v
Lecture 7 – Data Types CSC 331 17
Examples
• struct in C
struct IntCharReal
{ int i;
char c;
double r;
}
int char double
• record in Ada
type IntCharReal is record
i: integer;
c: character;
r: float;
end record;
Lecture 7 – Data Types CSC 331 18
The same type?
struct IntCharReal
{ int i;
char c;
double r;
}
struct IntCharReal
{ char c;
int i;
double r;
}
Lecture 7 – Data Types CSC 331 19
The same type?
struct IntCharReal
{ int i;
char c;
double r;
}
struct IntCharReal
{ int j;
char ch;
double d;
}
Lecture 7 – Data Types CSC 331 20
Record/structure are not exactly
Cartesian products
• Component selector: projection by component
names
struct IntCharReal x;
x.i;
• Most languages consider component names to be
part of the type.
• Thus the previous two types can be considered
different, even though they represent the same
Cartesian product.
Lecture 7 – Data Types 21
ML: Pure Cartesian Product
type IntCharReal = int * char * real;
• (2, #"a", 3.14)
• #3(2, #"a", 3.14) = 3.14
Lecture 7 – Data Types CSC 331 22
Union
• U V = { x | xU or xV}
– data items with different types are stored in overlapping
region, reduce memory allocation.
– Only one type of value is valid at one time.
– E.g.,
union IntOrReal {
int i;
double r;
}
• Different from records?
Lecture 7 – Data Types CSC 331 23
Undiscriminated Union in C
union IntOrReal {
int i;
double r;
}
union IntOrReal x;
x.i = 1;
printf(“%f\n”, x.r);
• Can be unsafe
Lecture 7 – Data Types 24
Create Discriminated Union in C++
struct IntOrReal {
bool isInt;
union {
int i;
double r;
};
};
IntOrReal x;
x.isInt = true;
x.i = 1;
...
if (x.isInt) printf(“%d\n”, x.i);
else printf(“%f\n”, x.r);
• Safe now
• or not?
Lecture 7 – Data Types 25
Discriminated Union in Ada
• Variant record (with tag or discriminator)
type Disc is (IsInt, IsReal);
type IntOrReal (which: Disc) is
record
case which is
when IsInt => i: integer;
when IsReal => r: float;
end case;
end record;
...
x: IntOrReal := (IsReal, 2.3);
put (x.i); -- generates ERROR
• Safe: programmers won’t be able to create
inconsistent data
Lecture 7 – Data Types CSC 331 26
Discriminated Union in Pascal
• Variant record
• Can be unsafe:
– First, the tag is optional
– Second, the tag can be set inconsistently.
Lecture 7 – Data Types 27
Discriminated Union in ML
datatype IntOrReal =
IsInt of int | IsReal of real;
• val x = IsReal(2.3);
28
How about Java?
• Is there record or union in java? Why?
Lecture 7 – Data Types 29
“Union” in Java
• public abstract class A {…};
public class B extends A {…};
public class C extends A {…};
Abstract class A: union of B and C.
• Discriminated union: instanceof
Lecture 7 – Data Types 30
Subset
• U = { v | v satisfies certain conditions and vV}
• Ada subtype
• Example 1
– type Digit_Type is range 0..9;
– subtype IntDigit_Type is integer range 0..9;
Lecture 7 – Data Types 31
subtype in Ada
• Example 2
type Disc is (IsInt, IsReal);
type IntOrReal (which: Disc) is
record
case which is
when IsInt => i: integer;
when IsReal => r: float;
end case;
end record;
subtype IRInt is IntOrReal(IsInt);
subtype IRReal is IntOrReal(IsReal);
x: IRReal := 2.3;
Lecture 7 – Data Types 32
Powerset
• P(U) = { U’ | U’ U }
• Example: Pascal
set of <ordinal type>
– var S: set of 1.. 10;
– var S: 1.. 10;
What’s the difference?
• The order isn’t significant though
unordered, values are distinct
Lecture 7 – Data Types 33
set of in Pascal
var S, T: set of 1 .. 10;
S := [1, 2, 3, 5, 7];
T := [1 .. 6];
Set operations can be performed on the variables.
What are these?
• T := S*T;
• If T = [1, 3, 5] then …;
• x = 3; if x in S then …;
• if S<=T then …;
• (*) (+) − (-) = (=) (<>)
• (>) (>=) (<) (<=) (in)
Lecture 7 – Data Types 34
Arrays and Functions
f: U → V
index type component type
• [0, …] (C/C++/Java)
• Ordinal type (Ada/Pascal)
Lecture 7 – Data Types 35
C/C++
Allocated on stack, size statically specified.
typedef int TenIntArray [10];
typedef int IntArray [];
TenIntArray x;
int y[5];
int z[]={1,2,3,4};
IntArray w={1,2};
IntArray w; //illegal
int n = ... //from user input
int a[n]; //illegal
Lecture 7 – Data Types 36
Java
Allocated on heap, size dynamically specified;
Size can be obtained by .length
int n = ... //from user input
int [] x = new int [n];
System.out.println(x.length);
Lecture 7 – Data Types 37
Ada
size dynamically specified;
Set of subscripts
type IntToInt is array(integer range <>) of integer;
get(n); //from user input
x: IntToInt(1..n);
for i in x’range loop
put(x(i));
end loop;
38
Multi-dimensional arrays
• C/C++
int x[10][20];
• Java ??
int [][] x = new int [10][20];
• Python ??
Lecture 7 – Data Types 39
Storage
• row-major form
x[1,-10],x[1,-9],…,x[1,10],x[2,-10],…,x[2,10],x[3,-10],…
• column-major form
x[1,-10],x[2,-10],…,x[10,-10],x[1,-9],…,x[10,-9],x[1,-8],…
• C/C++
int array_max(int a[][20], int size)
• Java
int array_max(int [][][]a)
Lecture 7 – Data Types 40