So let's continue to talk about the C fundamental types. There'll be other types later on like pointer types, and struct types, and a num types. But for the moment, we're going to concentrate on fairly simple set of types, maybe not that simple. Our early computations will do a lot with int, and double, and char. Intuitively, you can understand that a char might be a special character like a or a capital N, or the character that's the digit 5 which is going to be different than the value of five, or an unprinted character that moves your screen lines, so that's represented by backslash n. So the characters can represent what's called the ASCII table of characters, it's typically all the lowercase, all the uppercase, punctuation, operator characters, digits, and some special characters like new line. The integers are pretty much what you're used to since grade school. There are numbers like zero or minus three or plus 77. Then finally there are doubles. These are more like the scientific notation, and there you get numbers like 1.245 or 3.2 with an E which designates that something is an exponent, the exponent is a power of 10, so it's 10_5. So that's going to be 320,000. Then we're going to allow the fundamental types to have further modifiers. The two critical modifiers are going to be unsigned and long. The idea of unsigned is going to apply to strictly the integers, and that's going to mean that you're going to rule out the negative numbers. Long is going to apply to both the integers and to the doubles, and they're going to mean, well, we might have a range which typically for the integers is plus or minus two billion, and we want a longer range. So that will increase the range of those numbers significantly and we might need it for a bigger calculation over a bigger numbers. Finally, the same thing is true for doubles, we're actually going to have three kinds of doubles. We're going to have float, double, and long double. On a typical implementation, these are going to be longer and longer and therefore capable of storing a bigger and bigger number. Well, it's not like mathematics, it's not like you can imagine a number like Pi in which there's an infinite number of decimal place. So the mathematicians conception of Pi is potentially this infinite string. That's not doable. A computer memories finite resource, it's organized in terms of bytes. A byte is unit of memory which is conventionally eight bits, and eight bits can only store so much information. Basically, they can store two to the eighth. So here's a number that can be stored. Typically, these things are bits so 0001010. Remember, computers are binary and they store bits, they store them somehow electronically, magnetically, unless you are going to work with some fancy quantum computer. But on all our actual modern digital computer uses a base two designation and bits to represent whatever you need to represent when running a piece of computer code. Well, if you look at this, this is the zeros place, this is two to the fourth, two to the third, two to the second, two to first. So now I have this work, this is two to the fourth which would be 16 and two squared is four, so we're going to actually get the number 20. Very easy to make a mistake if you're not a computer. On a typical machine, an int is four bytes, and an int can be used to represent between roughly two billion minus two billion and plus two billion. This is more exact, so actually this is equal to 2_32 minus 1. That shows you four bytes can be used to store 32 binary digits, one of the digits is going to be used for the sign, so that leaves 31 digits for everything else, and that's why this can be roughly 2_32 minus 1. Now, when you write your code, you need to know what is representable. The way you can find that out, you can see what a type will store by using a built-in operator one of your keywords in C using sizeof. We're going to show that. So one of the funky things about C is certain things could be system dependent. Why is that? Because C attempts to be efficient in relation to the underlying computer. So it's not attempting to have universally the same semantics because some computers have very big word sizes and some computers that small words size, and C wants to run efficiently on a computer that has an int size of two bytes, as well as supercomputer which might have a 16 byte ints. So you do have to know and realize that you're running on a particular system and you can even if you're very sophisticated program, ensure that your system has sizes that are appropriate for your computation. You can look at that dynamically by using this size of opera. You can see it here. There's a sizeof print, a sizeof long int, a sizeof a char, and here you see you can use a variable. I could have said char, but I can also use the variable. So sizeof will operate on either a variable name or on an actual type name, here's float double and long double, and let's execute that program for the system, it's a McIntyre system. There on my system, an int is four bytes, a long int is eight bytes, a char is one byte, a float is four bytes, a double is eight bytes, and a long double is 16 bytes. So you should go and try that on whatever system you're using.