Standardy neříkají nic o přesné velikosti jakýchkoli celočíselných typů kromě char
. Obvykle long
je 32bitový na 32bitových systémech a 64bitový na 64bitových systémech.
Norma však specifikuje minimum velikost. Z oddílu 5.2.4.2.1 standardu C:
1 Níže uvedené hodnoty budou nahrazeny konstantními výrazy vhodnými pro použití v
#if
direktivy pro předběžné zpracování. Navíc, kroměCHAR_BIT
aMB_LEN_MAX
, následující bude nahrazeno výrazy, které mají stejný typ jako výraz, který je objektem odpovídajícího typu převedený podle celočíselných povýšení. Jejich hodnoty definované implementací musí být stejné nebo větší, pokud jde o velikost (absolutní hodnota), než uvedené hodnoty, se stejným znaménkem....
minimální hodnota pro objekt typu
long int
LONG_MIN
-2147483647 // −(2^31−1)maximální hodnota pro objekt typu
long int
LONG_MAX
+2147483647 // 2^31−1
To říká, že long int
musí být minimálně 32 bitů, ale může být i větší. Na počítači, kde je CHAR_BIT
je 8, to dává minimální velikost bajtů 4. Nicméně na počítači s např. CHAR_BIT
rovno 16, long int
může mít délku 2 bajty.
Zde je příklad ze skutečného světa. Pro následující kód:
#include <stdio.h>
int main ()
{
printf("sizeof(long) = %zu\n", sizeof(long));
return 0;
}
Výstup na Debian 7 i686:
sizeof(long) =4
Výstup na CentOS 7 x64:
sizeof(long) =8
Takže ne, nemůžete dělat žádné předpoklady o velikosti. Pokud potřebujete typ konkrétní velikosti, můžete použít typy definované v stdint.h
. Definuje následující typy:
int8_t
:podepsaná 8bitováuint8_t
:8bitový bez znaménkaint16_t
:podepsaná 16bitováuint16_t
:16bitová verze bez znaménkaint32_t
:podepsaná 32bitováuint32_t
:32bitová verze bez znaménkaint64_t
:podepsaná 64bitováuint64_t
:64bitová verze bez znaménka
stdint.h
záhlaví je popsáno v části 7.20 normy, s přesnými typy šířky v části 7.20.1.1. Standard uvádí, že tyto definice typu jsou volitelné, ale existují ve většině implementací.
Ne, ani standard C, ani POSIX to nezaručují a ve skutečnosti má většina 64bitových platforem podobných Unixu 64bitový (8bajtový) long
.