7

Увидел в коде вот такое выражение:

long long value = ...;

Почему здесь long 2 раза? Это опечатка или такое корректно и действительно что-то значит? Если так, то что изменится, если один long стереть или если, наоборот, дописать еще один?

mymedia
  • 8,602
angry
  • 8,677
  • 18
  • 74
  • 182

5 Answers5

9

Из ISO/IEC 9899:1999 (E):

4 There are five standard signed integer types, designated as signed char, short int, int, long int, and long long int. (These and other types may be designated in several additional ways, as described in 6.7.2.) There may also be implementation-defined extended signed integer types.28) The standard and extended signed integer types are collectively called signed integer types.29)

— minimum value for an object of type long int LONG_MIN -2147483647 // -(2^31 - 1)

— maximum value for an object of type long int LONG_MAX +2147483647 // 2^31 - 1

— minimum value for an object of type long long int LLONG_MIN -9223372036854775807 // -(2^63 - 1)

— maximum value for an object of type long long int LLONG_MAX +9223372036854775807 // 2^63 - 1

alexlz
  • 7,313
  • 16
  • 14
  • Странно. В этом списке всё равно нет long long, только long long int. – angry May 06 '11 at 16:35
  • Ничего странного. Можно ведь написать просто 'long' и компилятор поймет, что речь идет о 'long int'. Т.е. int - это тип по умолчанию. – gecube May 06 '11 at 16:40
  • Насчет типа по умолчанию -- все верно. Можно только добавить, что long long появился недавно и есть стандартом 2010. – 3JIoi_Hy6 May 06 '11 at 17:55
  • Опять из стандарта 6.7.2 Type specifiers: ... At least one type specifier shall be given in the declaration specifiers in each declaration, and in the specifier-qualifier list in each struct declaration and type name. .... — long, signed long, long int, or signed long int ... — long long, signed long long, long long int, or signed long long int – alexlz May 06 '11 at 19:43
  • Кроме одного случая - констант. Если я правильно помню. Можно невозбранно написать const i = 10; Правда, что там за тип переменной получится - хз. Скорее всего double или int. – gecube May 06 '11 at 19:50
  • @3JIoi_Hy6: long long появился в 1999 году в стандарте С99. – AnT stands with Russia Oct 07 '18 at 18:39
  • @gecube: Такое допускалось только в классическом С89/90. Начиная с С99 ни о каком const i больше не может быть и речи. – AnT stands with Russia Oct 07 '18 at 18:41
  • Тот факт, что long long эквивалентен long long int не является проявлением того, что int - якобы тип "по умолчанию". Правило типа по умолчанию в С уже давно отменено. Тем не менее эта эквивалентность сохраняется. – AnT stands with Russia Oct 08 '18 at 00:08
4

О константах. В комментариях нет форматирования. Поэтому сюда:

#include <stdio.h>
int main() {
    const i = 10000000001;
    printf ("%ld", i);
    return 0;
}

$ gcc -o c -std=c99 c.c c.c: В функции ‘main’: c.c:3: предупреждение: в декларации ‘i’ по умолчанию установлен тип ‘int’ c.c:3: предупреждение: переполнение при неявном преобразовании константы

тогда как

const long long i = 10000000001l;
printf("%lld", i);

выводит правильно. gcc 4.3.4

alexlz
  • 7,313
  • 16
  • 14
3

long и short "расширение" (не могу вспомнить/подобрать подходящее слово) для типа int.
Т.е. здесь написано long long int, что по идее должно увеличить размер типа, хотя мой компилятор показывает одинаковый размер для long и long long.

#include <stdio.h>

int main(){ short int i_1; int i0; long int i1; long long int i2; printf("short int = %d\nint = %d\nlong int = %d\nlong long int = %d\n", sizeof(i_1), sizeof(i0), sizeof(i1), sizeof(i2)); return 0; }

Вывод:

short int = 2
int = 4
long int = 8
long long int = 8
AlexDenisov
  • 6,442
  • 1
  • 21
  • 29
3

Для 64-bit машины и long и long long это 64-х разрядное целое (8 байт), для 32-bit машины long это 32-х разрядное целое (4 байт), а long long 64-х разрядное целое (8 байт).

Вообще, для переносимости так писать правильно.

avp
  • 46,098
  • 6
  • 48
  • 116
  • Windows с тобой не соглясен. – Qwertiy Sep 27 '17 at 14:04
  • @Qwertiy♦: "Согласие" или "не согласие" в таких вопросах целиком и полностью определяется реализацией (компилятором) и никак не связано с ОС. Так что Windows здесь ни при чем. – AnT stands with Russia Oct 07 '18 at 18:37
  • @AnT, все компиляторы под Windows сделали 32-битный long. Где-то табличка была. – Qwertiy Oct 07 '18 at 19:53
  • @Qwertiy, в винде в самом деле так. Наверное БГ решил когда-то (не знаю уж с какой далеко идущей целью или просто так получилось ...). В мире *nix long это размер регистра. В винде long -- двойное слово в терминах их терминологии еще 16-битных времен. Короче, long в винде 32 bit даже в 64-bit компах. При этом размер указателя в 64-bit все же размером с регистр. Лучше просто не пишите в такой системе (по крайней мере без значительного вознаграждения) – avp Oct 07 '18 at 20:14
1

long long это 64-битное целое, аналог __int64 в Microsoft Visual C++, в то время как просто long - 32-битное целое.

gote
  • 1,543