Data types in C++

In C++, data types specify what kind of data can be stored and manipulated within a program. Essentially, a data type defines how the compiler or interpreter should process the stored data. Using correct data types ensures optimal memory usage and prevents errors in programming.

What are Data Types?

Data types in C++ define the type of data a variable can hold. This could range from integers, decimals, characters, to logical values. Choosing the correct data type is crucial for efficient memory utilization and accurate computation.

Why are Data Types Used?

Data types ensure that operations on variables are performed correctly. They help the compiler understand the type of data it should expect, allocate the appropriate memory space, and apply relevant operations, thus enhancing efficiency and preventing runtime errors.

Below are different data types in C++

Data TypeDescriptionSize (bytes)Value RangeFormat Specifier
boolStores true or false values1true or false%d or %i
charCharacter or small integer1-128 to 127 or 0 to 255 (unsigned)%c (as char), %d (as int)
signed charSmall integer (always signed)1-128 to 127%c (as char), %d (as int)
unsigned charSmall integer (always unsigned)10 to 255%c (as char), %u (as int)
short or short intSmall integer2-32,768 to 32,767%hd
unsigned shortSmall unsigned integer20 to 65,535%hu
intInteger4 (typically)-2,147,483,648 to 2,147,483,647%d or %i
unsigned intUnsigned integer4 (typically)0 to 4,294,967,295%u
long or long intLong integer4 or 8-2,147,483,648 to 2,147,483,647 (32-bit) <br> -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 (64-bit)%ld
unsigned longUnsigned long integer4 or 80 to 4,294,967,295 (32-bit) <br> 0 to 18,446,744,073,709,551,615 (64-bit)%lu
long longVery long integer8-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807%lld
unsigned long longUnsigned very long integer80 to 18,446,744,073,709,551,615%llu
floatSingle-precision floating-point4±3.4E±38 (7 digits precision)%f
doubleDouble-precision floating-point8±1.7E±308 (15 digits precision)%lf
long doubleExtended-precision floating-point8, 12, or 16±1.1E±4932 (19 digits precision)%Lf
wchar_tWide character2 or 41 wide character%lc
size_tUnsigned integer for sizes4 or 80 to MAX_SIZE (platform dependent)%zu
voidIncomplete type, no values

What Are Signed and Unsigned Data Types in C++?

In C++, data types can be either signed or unsigned, and understanding the difference between them is crucial when dealing with numbers, especially in low-level or performance-critical applications. These variations determine whether a variable can store negative values or only non-negative values.

Signed Data Types

Signed data types can represent both positive and negative values. By default, most integer types in C++—like int, short, and long—are signed unless explicitly declared otherwise. A portion of their bits is used to indicate the sign of the number (typically the most significant bit). For example, a signed int can usually store values ranging from -2,147,483,648 to 2,147,483,647. These types are useful when negative numbers make sense in your context, such as in banking, temperature calculations, or error codes.

Unsigned Data Types

Unsigned data types can only store non-negative values—meaning 0 and positive numbers. Since no bits are reserved for sign representation, the entire bit range is available for positive values, effectively doubling the maximum limit compared to their signed counterparts. For example, an unsigned int can store values from 0 to 4,294,967,295. These are ideal for scenarios like counting items, indexing arrays, or representing memory sizes where negative values don’t apply.

Comparison Table

CategoryData TypesDefault Behavior
Signed by Defaultchar (may be signed or unsigned depending on implementation)Can represent both positive and negative values
signed charAlways signed
intAlways signed
short or short intAlways signed
long or long intAlways signed
long long or long long int (C++11)Always signed
floatSigned (can be positive or negative)
doubleSigned (can be positive or negative)
long doubleSigned (can be positive or negative)
Explicitly Unsignedunsigned charCan only represent non-negative values
unsigned intCan only represent non-negative values
unsigned short or unsigned short intCan only represent non-negative values
unsigned long or unsigned long intCan only represent non-negative values
unsigned long long or unsigned long long int (C++11)Can only represent non-negative values
Boolean TypeboolNot applicable (represents true/false)
Character Typeswchar_tImplementation-defined signedness
char8_t (C++20)Always unsigned
char16_t (C++11)Always unsigned
char32_t (C++11)Always unsigned
Other TypesvoidNot applicable (incomplete type)
std::size_tAlways unsigned
std::ptrdiff_tAlways signed

Example

#include <iostream>
using namespace std;

int main() {
    signed int a = -10;
    unsigned int b = 10;

    cout << "Signed int a: " << a << endl;
    cout << "Unsigned int b: " << b << endl;

    // Assigning a negative value to an unsigned variable
    unsigned int overflow = -1;
    cout << "Unsigned overflow: " << overflow << endl;

    return 0;
}
Signed int a: -10
Unsigned int b: 10
Unsigned overflow: 4294967295

Fundamental data types in c++

1. int (Integer)

The int data type represents integer numbers, which can be positive, negative, or zero without a fractional component. It typically occupies 4 bytes (32 bits) in memory, allowing it to store numbers roughly from −2,147,483,648 to 2,147,483,647. It is commonly used for counting, indexing, or storing numerical data that does not require decimals.

Syntax:

int variableName = value;

Example:

int age = 25; 
std::cout << "Age is: " << age;

2. float (Floating Point)

The float data type is used for numbers with decimal points. It occupies 4 bytes of memory, allowing precision up to about 7 decimal digits. It’s useful for calculations involving fractional numbers but might lack precision for highly precise calculations.

Syntax:

float variableName = value;

Example:

float price = 45.75;
std::cout << "Price is: " << price;

3. double (Double Precision Floating Point)

The double data type is similar to float but provides double the precision, typically occupying 8 bytes of memory and offering precision up to 15–17 significant digits. It’s used when greater accuracy and precision in numerical computations are necessary.

Syntax:

double variableName = value;

Example:

double pi = 3.14159265358979;
std::cout << "Value of pi: " << pi;

4. char (Character)

The char data type stores single characters, such as letters, digits, punctuation marks, or symbols, using 1 byte of memory. Characters are internally stored as ASCII values. It is commonly used for representing text-based data.

Syntax:

char variableName = 'character';

Example:

char initial = 'A';
std::cout << "Initial is: " << initial;

5. bool (Boolean)

The bool data type stores logical values—either true (non-zero) or false (zero). It occupies 1 byte in memory and is commonly used to control conditional logic and branching within code.

Syntax:

bool variableName = true; // or false

Example:

bool isValid = true;
if(isValid){
    std::cout << "Valid data!";
}

6. void (Void)

The void type specifies that no value is available. It is mainly used for defining functions that do not return any value, or pointers with no specific data type (generic pointers).

Syntax:

void functionName() { 
    // No return statement
}

Example:

void greet() {
    std::cout << "Hello!";
}

7. Modifiers: short, long, signed, and unsigned

These modifiers can be applied to fundamental data types like int or char to alter their storage size or sign. For instance, unsigned int can store only non-negative integers, effectively doubling the positive range.

Syntax:

unsigned int variableName = value;
long int longVariableName = value;
short int shortVariableName = value;

Example:

unsigned int positiveNumber = 3000;
short int smallNumber = 500;
long int largeNumber = 1000000;
std::cout << "Positive: " << positiveNumber;

Frequently Asked Questions (FAQs)

1. What is the difference between float and double in C++?
Float provides single precision, occupying 4 bytes, while double offers double precision and occupies 8 bytes, making it suitable for more precise calculations.

2. Can I use int to store decimal numbers?
No, int can only store whole numbers. To store decimal numbers, you must use either float or double.

3. When should I use unsigned integers?
Use unsigned integers when you are certain the data will never be negative, such as counts, indexes, or memory sizes.

4. How many bytes does a char occupy, and can it store multiple characters?
A char occupies only 1 byte and can store exactly one character. To store multiple characters, use strings or character arrays.

5. Why should I bother choosing the correct data type?
Choosing the correct data type improves memory usage, ensures accuracy, enhances performance, and reduces the likelihood of errors in your program.