240 likes | 320 Views
Explore various numeric types in C programming, including integers and floating-point numbers. Learn about sizes, signed vs. unsigned, portability issues, C99 enhancements, literals, promotion, conversion specifiers, length modifiers, and input with scanf.
E N D
Numeric types of C • Integers • Signed and unsigned • In a few different sizes • 209 • Floating point • In different size • 209.602
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
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 bit as long • Provides bit-length specific integers • int32_t i ; • Declares a 32-bit integer • If <inttype.h> is included
Unsigned • Useful when you know number is positive • As in counts • Gives you twice as many positive value • For 8 bit numbers which is it? • 00000001 > 11111111 • 00000001 < 11111111
Floating point types by size • float • Usually IEEE 754 32-bit single precision • double • Usually IEEE 754 64-bit double precision • long double • Often same as double • Could be IEEE 754-2008 128-bit “quad” precision • Could be Intel 80-bit “extended” precision
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 promotionEvil 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”, 3.1416f) ; • printf(” %25.20f\n”, 3.1416) ; • 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
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”, 20000000000000L) ; • There is also largely unneeded h and hh • Prints the short and char part of an int
Length modifiers for floating point • Use L for long double as in printf(“Big number is %Lf\n”, 2e2009L) ;
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 %X is the same as %x %F, %e, %E, %g, %G are the same as %f
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