Numeric types of C Integers – Signed and unsigned – In a few different sizes – 209 Floating point – In different sizes –
Integer types by size char – Holds single characters short – Holds small numbers int – The usual integer long – When 2,000,000,000 isn’t enough
What you can say about size? short is at least as big as char int is at least as big as short long is a least as bit as int I.E., not much
On my office PC char 8 bits short 16 bits int 32 bits long 32 bits
On my web server char 8 bits short 16 bits int 32 bits long 64 bits
Max and min – twos complement bits bits bits bits
C Portability Problem It’s hard to write portable programs – When you don’t know what an int will hold More likely to be a problem with small chips – Such as embedded processors sizeof(int) will give the size in bytes – But this is hard too use without macros
C99 as problem and solution C99 adds an additional integer type – long long At least as big as long Provides bit-length specific integers – int32_t i ; Declares a 32-bit integer If is included
Unsigned Useful when you know number is positive – As in counts – Gives you twice as many positive values For 8 bit numbers which is it? – > – <
Floating point types by size float – Usually IEEE bit single precision double – Usually IEEE bit double precision long double – Often same as double – Could be IEEE bit “quad” precision – Could be Intel 80-bit “extended” precision
On my office PC typeprecisionrange float ~ 7 digits10 38 double ~ 15 digits long double ~ 17 digits
Integer literals Decimal – 209 Octal – 0321 Hexadecimal – 0xD1 Suffixes – U for unsigned – L for long
Floating point literals With a dot but no exponent – 10.5, 1.,.2 With an exponent and possibly a dot – 2e20,.2e20, 2.e20, 2.2e20, 7e-15 With possible suffixes – F for float – L for long
Default argument promotion Evil in C If a char or short is an argument to printf – It is promoted to an int If a float is an argument to printf – It is promoted to a double printf cannot tell signed from unsigned The above statements aren’t quite true, but they are good enough for now. In a later chapter, you’ll learn about prototypes and all of this may become a little clearer.
Therefore … printf “thinks” the following are identical – printf(" %c\n", 'A') ; – printf(" %c\n", 65) ; As are the following – printf(" %25.20f\n", f) ; – printf(" %25.20f\n", ) ; You may need to “tell” printf more or less than you think necessary
However Assume – int and long int are different – double and long double are different Because – They often take up more space on the stack Unless they are the same length – Which often is the case » Isn’t this confusing
Conversion specifiers for integers %c Prints as a character %d Prints as a decimal number %i Prints as a decimal number %o Prints as an unsigned octal number %x Prints as an unsigned hexadecimal number Letters in lower case %X Prints as an unsigned hexadecimal number Letters in upper case %u Prints as an unsigned decimal number
Length modifiers for integers Can proceed the integer conversion specifier – Except for %c Only useful one is l, as in printf("Big number is %ld\n", L) ; There is also largely unneeded h and hh – Prints the short and char part of an int
Conversion specifiers for floating point %e Prints in “scientific” notation e-4 %f Prints with fixed decimal %g Decides which of %e and %f look better %E %e with a big E %G %g with a big E
Length modifiers for floating point Use L for long double as in printf("Big number is %Lf\n", 2e2010L) ;
Input with scanf To read numbers use scanf scanf("%d", &courseNumber) ; scanf("%f", &temperature) ; Notice the & – It will be explained later in the course It means “address of”
Conversion specifiers for scanf %c Read the next character %d Read decimal integer %o Read octal integer %x Read hexadecimal integer %i Read integer – with 0 or 0x as prefix %u Read unsigned integer %f Read floating point %X is the same as %x %F, %e, %E, %g, %G are the same as %f
Length modifiers for scanf %l for long int or double %L for long double %h for short %hh for char given as integer
Matching scanf("%d,%d", &i, &j) ; – A comma must be between the numbers scanf("%d%%d", &i, &j) ; – A percent sign must be between the numbers