В чем разница между длинным длинным и длинным - PullRequest
22 голосов
/ 24 июня 2011

Какая разница между длинным длинным и длинным?И они оба не работают с 12-значными числами (600851475143), я что-то забыл?

#include <iostream>
using namespace std;

int main(){
  long long a = 600851475143;
}

Ответы [ 5 ]

45 голосов
/ 24 июня 2011

На основных 32-битных платформах:

  • int - это 32 бита
  • long также 32 бита
  • long long - 64 бита

На основных 64-битных платформах:

  • int составляет 32 бита
  • long - 32 или 64 бита
  • long long также составляет 64 бита

По стандарту:

  • int должно быть не менее 16 бит
  • long должно быть не менее 32 бит
  • long long должно быть не менее 64 бит

Поправь меня, если я ошибаюсь.

Если вам нужен конкретный целочисленный размер для конкретного приложения, вместо того, чтобы доверять компилятору выбрать нужный вам размер, #include <stdint.h> (или <cstdint>), чтобы вы могли использовать следующие типы:

  • int8_t и uint8_t
  • int16_t и uint16_t
  • int32_t и uint32_t
  • int64_t и uint64_t

Вас также может заинтересовать #include <stddef.h> (или <cstddef>):

  • size_t
  • ptrdiff_t
7 голосов
/ 24 июня 2011

long long не существует в C ++ 98 / C ++ 03, но существует в C99 и c ++ 0x.

long гарантируется как минимум 32 бита.

long long гарантируется как минимум 64 бита.

2 голосов
/ 24 июня 2011

Чтобы уточнить комментарий @ ildjarn:

И они оба не работают с 12-значными числами (600851475143), я что-то забыл?

Компиляторпросматривает литеральное значение 600851475143 , не учитывая переменную, которой вы его назначаете / инициализируете.Вы написали его как типизированный литерал int, и он не поместится в int.

. Используйте 600851475143LL, чтобы получить long long типизированный литерал.

0 голосов
/ 24 июня 2011

Зависит от вашего compiler.long long - 64 бита и должен обрабатывать 12 цифр. Похоже, в вашем случае он просто рассматривает его как длинный и, следовательно, не обрабатывает 12 цифр.

0 голосов
/ 24 июня 2011

Ваш компилятор C ++ поддерживает long long, который гарантированно должен быть не менее 64-разрядным в стандарте C99 (это стандарт C, а не стандарт C ++).См. Заголовочный файл Visual C ++ для получения диапазонов в вашей системе.

Рекомендация

Для новых программ рекомендуется использовать только bool, char, int и double, пока не возникнут обстоятельства, чтонужен один из других типов.

http://www.somacon.com/p111.php

...