GNU/Linux >> Znalost Linux >  >> Linux

Mohu předpokládat, že velikost long int je vždy 4 bajty?

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 a MB_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énka
  • int16_t :podepsaná 16bitová
  • uint16_t :16bitová verze bez znaménka
  • int32_t :podepsaná 32bitová
  • uint32_t :32bitová verze bez znaménka
  • int64_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 .


Linux
  1. Jak velký je Pipe Buffer?

  2. Zjištění velikosti sektoru oddílu?

  3. Proč Ls a Hexdump nesouhlasí s velikostí souboru?

  1. Získejte velikost databáze v MySQL

  2. Jak mohu vidět velikost souborů a adresářů v linuxu?

  3. Jak mohu *pouze* získat počet bajtů dostupných na disku v bash?

  1. Mohu zvětšit velikost obrazu disku založeného na souboru?

  2. Proč nemohu rolovat v terminálu?

  3. Mohu změnit SID databáze Oracle?