Увидел в коде вот такое выражение:
long long value = ...;
Почему здесь long 2 раза? Это опечатка или такое корректно и действительно что-то значит? Если так, то что изменится, если один long стереть или если, наоборот, дописать еще один?
Из 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
О константах. В комментариях нет форматирования. Поэтому сюда:
#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
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
Для 64-bit машины и long и long long это 64-х разрядное целое (8 байт), для 32-bit машины long это 32-х разрядное целое (4 байт), а long long 64-х разрядное целое (8 байт).
Вообще, для переносимости так писать правильно.
long long это 64-битное целое, аналог __int64 в Microsoft Visual C++, в то время как просто long - 32-битное целое.
long longпоявился в 1999 году в стандарте С99. – AnT stands with Russia Oct 07 '18 at 18:39const iбольше не может быть и речи. – AnT stands with Russia Oct 07 '18 at 18:41long longэквивалентенlong long intне является проявлением того, чтоint- якобы тип "по умолчанию". Правило типа по умолчанию в С уже давно отменено. Тем не менее эта эквивалентность сохраняется. – AnT stands with Russia Oct 08 '18 at 00:08