← Все вопросы

Типы данных в C++: чем int отличается от long, и сколько байт занимает double?

Задан 18 месяцев назад168 просмотров2 ответа
5

Учу C++, и меня смущает зоопарк числовых типов. В Python был просто int и float, а тут int, long, long long, short, float, double...

int a = 1000000000;
int b = a * 3;   // получил отрицательное число, почему??

Как понять, какой тип когда брать, и какие у них размеры? Особенно интересует, почему int переполняется и сколько байт у double.

2 ответа

10
✓ Принятый ответ — помог автору

Твоя проблема — переполнение int. int обычно 4 байта, это диапазон примерно от −2.1 млрд до +2.1 млрд. 1000000000 * 3 = 3 млрд уже не влезает, и число «перекручивается» в отрицательное.

Вот основные типы и их типичные размеры (на большинстве платформ, 64-бит):

Тип Размер Диапазон / точность
bool 1 байт true / false
char 1 байт символ, −128..127
short 2 байта ±32 тыс
int 4 байта ±2.1 млрд
long long 8 байт ±9.2·10^18
float 4 байта ~7 значащих цифр
double 8 байт ~15-16 значащих цифр

Чтобы узнать точно на своей машине:

#include <iostream>
using namespace std;

int main() {
    cout << sizeof(int) << "\n";        // 4
    cout << sizeof(double) << "\n";     // 8
    cout << sizeof(long long) << "\n";  // 8
    return 0;
}

Исправление твоего кода:

long long a = 1000000000;
long long b = a * 3;  // 3000000000, всё ок

Правило новичка-олимпиадника: если числа могут перевалить за пару миллиардов — сразу бери long long. Для дробных в 99% случаев double, float почти не нужен.

4

Важная тонкость: размеры типов не зафиксированы стандартом жёстко в байтах, гарантируется только что int >= short, long long >= long >= int и т.д. Поэтому на разных платформах long бывает 4 или 8 байт.

Если нужен точный размер — есть <cstdint>: int32_t, int64_t, uint64_t. Тогда никаких сюрпризов:

#include <cstdint>
int64_t big = 3000000000;  // ровно 8 байт всегда

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект