Topic : C Lessons
Author : Christopher Sawtell
Page : << Previous 3  Next >>
Go to page :


The code
will be just as good as that produced by an assembly code programmer of normal
skill - real guru programmers can do only slightly better.



Lesson 2


Data Storage Concepts.


        It has been stated that "data + algorithms = programs".
        This Lesson deals with with the first part of the addition sum.

  All information in a computer is stored as numbers represented using the
binary number system. The information may be either program instructions or
data elements. The latter are further subdivided into several different types,
and stored in the computer's memory in different places as directed by the
storage class used when the datum element is defined.

These types are:

  a) The Character.

     This is a group of 8 data bits and in 'C' represents either
     a letter of the Roman alphabet, or a small integer in the range of 0
     through to +255. So to arrange for the compiler to give you a named
     memory area in which to place a single letter you would "say":

  char letter;

     at the beginning of a program block. You should be aware that
                 whether or not a char is signed or unsigned is dependant
                 on the design of the processor underlying your compiler.
                 In particular, note that both the PDP-11, and VAX-11 made by
                 Digital Equipment Corporation have automatic sign extention of
char.
                 This means that the range of char is from -128 through to +127
                 on these machines. Consult your hardware manual, there may be
                 other exceptions to the trend towards unsigned char as the
default.

                 This test program should clear things up for you.

/* ----------------------------------------- */

#ident "@(#) - Test char signed / unsigned.";

#include <stdio.h>

main()
{
        char a;
        unsigned char b;

        a = b = 128;
        a >>= 1;
        b >>= 1;
  printf ( "\nYour computer has %ssigned char.\n\n", a == b ? "un" : "" );
        }

/* ----------------------------------------- */


     Here ( Surprise! Surprise! ) is its output on a machine which has
                 unsigned chars.

Your computer has unsigned char.

    Cut this program out of the news file. Compile and execute it on
                your computer in order to find out if you have signed or
unsigned char.

  b) The Integers.

     As you might imagine this is the storage type in which to store whole
     numbers. There are two sizes of integer which are known as short and long.
     The actual number of bits used in both of these types is Implementation
     Dependent. This is the way the jargonauts say that it varies from computer
     to computer. Almost all machines with a word size larger than sixteen bits
                 have the the long int fitting exactly into a machine word and
a short int
     represented by the contents of half a word. It's done this way because
                 most machines have instructions which will perform arithmetic
efficiently
                 on both the complete machine word as well as the half-word.
For the
                 sixteen bit machines, the long integer is two machine words
long,
                 and the short integer is one.

  short int smaller_number;
  long int big_number;

     Either of the words short or long may be omitted as a default is
                 provided by the compiler. Check your compiler's documentation
to see
                 which default you have been given. Also you should be aware
that some
                 compilers allow the you to arrange for the integers declared
with just
                 the word "int" to be either short or long. The range for a
short int on
                 a small computer is -32768 through to +32767, and for a long
int
                 -4294967296 through to +4294967295.

  c) The Real Numbers.

     Sometimes known as floating point numbers this number representation
     allows us to store values such as 3.141593, or -56743.098. So, using
     possible examples from a ship design program you declare floats and
     doubles like this:

  float length_of_water_line;     /* in meters */
  double displacement;            /* in grammes */


     In the same way that the integer type offers two sizes so does the
     floating point representation. They are called float and double. Taking
     the values from the file /usr/include/values.h the ranges which can be
     represented by float and double are:

  MAXFLOAT      3.40282346638528860e+38
  MINFLOAT      1.40129846432481707e-45
  MAXDOUBLE     1.79769313486231470e+308
  MINDOUBLE     4.94065645841246544e-324

     However you should note that for practical purposes the maximum
                 number of significant digits that can be represented by a
float
                 is approximately six and that by a double is twelve. Also you
should
                 be aware that the above numbers are as defined by the IEEE
floating
                 point standard and that some older machines and compilers do
not
                 conform. All small machines bought retail will conform. If you
are
                 in doubt I suggest that refer to your machine's documentation
for
                 the whole and exact story!


  d) Signed and unsigned prefixes.

     For both the character and integer types the declaration can be
                 preceded by the word "unsigned". This shifts the range so that
0
                 is the minimum, and the maximum is twice that of the signed
data
                 type in question. It's useful if you know that it is
impossible
            

Page : << Previous 3  Next >>