Data Types, Variables, and Operators

Understanding basic data types (int, float, char, etc.), declaring variables, and using arithmetic, relational, and logical operators.


Data Types in C Programming

In C programming, data types specify the type of data that a variable can hold. Understanding data types is crucial because it determines how much memory is allocated for a variable and what operations can be performed on it.

Understanding Basic Data Types

C provides several fundamental data types, which can be categorized as follows:

1. Integer Types (int)

Integer types are used to store whole numbers (numbers without a decimal point). C offers different sizes of integer types to accommodate varying ranges of values.

  • int: The standard integer type. Its size is platform-dependent (typically 4 bytes on modern systems), representing a range of values approximately from -2,147,483,648 to 2,147,483,647.
  • short int (or short): A smaller integer type, usually 2 bytes, with a smaller range than int.
  • long int (or long): A larger integer type, usually 4 or 8 bytes, providing a larger range than int. On many 64-bit systems, long is 8 bytes.
  • long long int (or long long): A very large integer type, typically 8 bytes, offering the widest range of integer values.
  • unsigned int: An integer type that only stores non-negative values (zero and positive numbers). It uses all bits to represent the magnitude, effectively doubling the positive range compared to a signed int.
  • signed int: The same as int. Specifies that the integer can be positive or negative. Usually implicit.

Example:

#include <stdio.h>

int main() {
    int age = 30;
    short smallerNumber = 100;
    long largerNumber = 1234567890;
    unsigned int positiveOnly = 4294967295; // Maximum value for unsigned int (assuming 4 bytes)

    printf("Age: %d\n", age);
    printf("Smaller Number: %hd\n", smallerNumber); // Use %hd for short int
    printf("Larger Number: %ld\n", largerNumber);  // Use %ld for long int
    printf("Positive Only: %u\n", positiveOnly);    // Use %u for unsigned int

    return 0;
} 

2. Floating-Point Types (float, double, long double)

Floating-point types are used to store numbers with a decimal point (real numbers). C offers different precisions for floating-point numbers.

  • float: A single-precision floating-point type, typically 4 bytes. It provides a moderate level of precision for representing decimal numbers.
  • double: A double-precision floating-point type, typically 8 bytes. It offers higher precision than float and is generally preferred for most floating-point calculations.
  • long double: An extended-precision floating-point type. Its size and precision are implementation-defined, but it is often 10 or 12 bytes and provides the highest precision.

Example:

#include <stdio.h>

int main() {
    float price = 99.99f; // The 'f' suffix indicates a float literal
    double pi = 3.14159265359;
    long double veryPrecise = 2.71828182845904523536028747135L; //The 'L' suffix indicates a long double literal

    printf("Price: %f\n", price);
    printf("Pi: %lf\n", pi);    // Use %lf for double
    printf("Very Precise Number: %Lf\n", veryPrecise); // Use %Lf for long double

    return 0;
} 

3. Character Type (char)

The char type is used to store a single character (e.g., a letter, digit, or symbol). It is typically 1 byte in size.

  • char: Represents a single character, stored as an integer value representing its ASCII code (or other character encoding).

Example:

#include <stdio.h>

int main() {
    char initial = 'J';
    char newline = '\n'; // Escape sequence for a newline character

    printf("Initial: %c%c", initial, newline); // Use %c to print a character

    return 0;
} 

4. Void Type (void)

The void type represents the absence of a type. It has several specific uses in C:

  • Function return type: Indicates that a function does not return a value.
  • Function arguments: Indicates that a function takes no arguments.
  • Pointers: A void pointer can point to data of any type. It is a generic pointer. You *must* cast a void pointer to a specific type before dereferencing it.

Example:

#include <stdio.h>

void print_message(void) {
    printf("This function returns nothing.\n");
}

int main() {
    print_message();

    int number = 10;
    void *ptr = &number; // void pointer points to an integer

    printf("Address of number: %p\n", ptr);
    printf("Value of number (via void pointer): %d\n", *(int *)ptr); // Cast to int* before dereferencing

    return 0;
} 

Summary Table

Data TypeDescriptionTypical Size (bytes)Format Specifier (printf)
intInteger4%d
short intShort Integer2%hd
long intLong Integer4 or 8%ld
long long intLong Long Integer8%lld
unsigned intUnsigned Integer4%u
floatFloating-point4%f
doubleDouble-precision floating-point8%lf
long doubleExtended-precision floating-point10 or 12%Lf
charCharacter1%c
voidRepresents the absence of a type.N/AN/A

Understanding these basic data types is fundamental to writing effective and efficient C programs. Choosing the correct data type for your variables is crucial for memory usage and program accuracy.