Типы данных в C++: чем int отличается от long, и сколько байт занимает double?
Учу C++, и меня смущает зоопарк числовых типов. В Python был просто int и float, а тут int, long, long long, short, float, double...
int a = 1000000000;
int b = a * 3; // получил отрицательное число, почему??
Как понять, какой тип когда брать, и какие у них размеры? Особенно интересует, почему int переполняется и сколько байт у double.
2 ответа
Твоя проблема — переполнение 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 почти не нужен.
Важная тонкость: размеры типов не зафиксированы стандартом жёстко в байтах, гарантируется только что int >= short, long long >= long >= int и т.д. Поэтому на разных платформах long бывает 4 или 8 байт.
Если нужен точный размер — есть <cstdint>: int32_t, int64_t, uint64_t. Тогда никаких сюрпризов:
#include <cstdint>
int64_t big = 3000000000; // ровно 8 байт всегда