- C Programming
- C Tutorial
- C Basic Syntax
- C Data Types
- C if...else Statement
- C switch Statement
- C for Loop
- C while Loop
- C do...while Loop
- C Jump Statements
- C Arrays
- C Strings
- C Pointers
- C Functions
- C Library Functions
- C Recursion
- C Variable Scope
- C Structures
- C Linked List
- C Stacks
- C Queues
- C Binary Tree
- C Header Files
- C File I/O
- C Programming Examples
- C Programming Examples
C Data Types
Data types are merely used to specify variables or functions. The variable type specifies how much storage space it will take up and how the bit pattern stored will be interpreted. C defines the four basic or primary data types as follows:
- The "char" type is used to declare a character-type variable.
- The "int" type is used to declare an integer-type variable.
- The "float" type is used to declare a floating-point type variable.
- The "double" type is used to declare a double-type variable.
Modifiers can be added before the basic data types. A type modifier modifies the meaning of the base type to better suit a specific need. The following are the modifiers:
- signed
- unsigned
- long
- short
Modifiers for the "int" base type include "signed," "short," "long," and "unsigned" values. Additionally, the "char" type can be set to "signed" or "unsigned." Additionally, "long" can be used with "double."
C Data Types with Size and Their Ranges
The following table lists all the data types with their sizes and ranges:
Type | Storage Size (in bytes) | Minimal Range |
---|---|---|
char | 1 | -127 to 127 |
unsigned char | 1 | 0 to 255 |
signed char | 1 | -127 to 127 |
int | 2 or 4 | -32,767 to 32,767 |
unsigned int | 2 or 4 | 0 to 65,535 |
signed int | 2 or 4 | -32,767 to 32,767 |
short int | 2 | -32,767 to 32,767 |
unsigned short int | 2 | 0 to 65,535 |
signed short int | 2 | -32,767 to 32,767 |
long int | 4 | -2,147,483,647 to 2,147,483,647 |
long long int | 8 | -(263-1) to 263-1 |
signed long int | 4 | -2,147,483,647 to 2,147,483,647 |
unsigned long int | 4 | 0 to 4,294,967,295 |
unsigned long long int | 8 | 264-1 |
float | 4 | 1E-37 to 1E+37 (six digits of precision) |
double | 8 | 1E-37 to 1E+37 (ten digits of precision) |
long double | 10 | 1E-37 to 1E+37 (ten digits of precision) |
Signed integers are important for a great many algorithms, but they only have half the absolute magnitude of their unsigned relatives. For instance, here, 32,767 in binary is:
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
When a type modifier doesn't precede a basic type, then int is assumed. Let's look at the following table:
specifier | is same as |
---|---|
signed | signed int |
unsigned | unsigned int |
long | long int |
short | short int |
Get the Exact Size of Any Data Type in C
Because "int" data types have different sizes on different platforms, use the "sizeof" operator to get the exact or actual size of a "int" type or "int" type variable on a specific platform. The expression "sizeof(type)" indicates the storage size of an object or type in bytes. The following example demonstrates how to obtain the precise size of an "int" type on any platform:
#include <stdio.h> int main() { printf("'int' storage size = %d\n", sizeof(int)); return 0; }
This C program was written in the "Code::Blocks" IDE, then built and executed. The output of the above program is shown in the following snapshot.
As you can see, the size of "int" in my platform is "4".
Change the name of the data type in a C program
There is a keyword named "typedef" that can be used in the C programming language to define a new name for a data type. The general form of the "typedef" keyword is as follows:
typedef type new_name;
For example:
typedef float mark;
Now "mark" will be the new name for the type "float" in the program. Consider the following program as an example:
#include <stdio.h> int main() { typedef float mark; mark a, b, c, tot; printf("Enter marks obtained in three subjects: "); scanf("%f %f %f", &a, &b, &c); tot = a+b+c; printf("\nTotal marks = %.2f \n", tot); return 0; }
Enter marks obtained in three subjects: 89 98.3 74 Total marks = 261.30
The ".2" is used to print only two digits after the decimal.
C type casting
Type casting is a technique for making an expression of a specific or required type. The general form of type casting in C is as follows.
(type) expression;
For example:
(float) i/2;
Assuming the "i" variable is of the "int" type. The preceding statement casts the expression as "float" rather than "int." As an example, consider the following program:
#include <stdio.h> int main() { int i = 11; float res; res = i/2; printf("%.2f \n", res); res = (float) i/2; printf("%.2f \n", res); return 0; }
5.00 5.50
Storage classes in C
Storage classes such as "auto," "extern," "static," and "register" can be used to define extra features of a variable or function. The table below summarizes the four storage classes available in the C programming language.
Specifier | Initial value | Scope |
---|---|---|
auto | garbage | within the block |
static | 0 | within the block |
register | garbage | within the block |
extern | 0 | global multiple files |
The "register" variable is stored in the CPU register. The "auto" and "register" variables exist until the end of the block, whereas the "static" and "external" variables exist until the end of the program.
The general form to use the storage class to add an extra feature to a variable or function in the C language is as follows:
storageClass type name;
Consider the following program as an example: In this program, I will use the "static" storage specifier to keep remembering the previous value during the complete program execution.
#include <stdio.h> void myfun(void); int main() { myfun(); myfun(); myfun(); return 0; } void myfun(void) { static int num = 1; printf("%d \n", num); num++; }
1 2 3
I called the function "myfun()" three times. Each time the value of "num" is printed on the output console, Since I used the "static" specifier before the variable "num," therefore, the variable "num" remembers its previous value. If I remove the "static" specifier from the previous program, then the output should be:
1 1 1
That is, when the variable "num" is used in the body of a function definition without the "static" specifier, it is treated as a new variable. You will learn all about the functions in C in a separate post.
« Previous Tutorial Next Tutorial »