Care este diferența dintre „short int” și „int” în C? (Programare, C, Tipuri)

Kanwaljeet Singh a intrebat.

Care este diferența dintre short int (sau short) și int în C? Au aceeași mărime și același interval. Dacă sunt în esență identice, la ce bun să avem două tipuri de date?

Comentarii

  • În compilatoarele pe 16 biți, acestea au aceeași dimensiune și interval. Practic, toate compilatoarele moderne pentru platformele obișnuite au sizeof(int) > sizeof(short). –  > Por Fred Foo.
9 răspunsuri
MByD

Ei poate să aibă aceeași dimensiune, dar este garantat că int este egală sau mai mare decât short int.

Comentarii

  • Ceea ce se garantează de fapt este că intervale din short int sunt de cel puțin -32767 .. +32767, iar intervalul lui short int este un subset al intervalului lui int. Din aceasta rezultă că short int și int sunt ambele de cel puțin 16 biți. Datorită biților de umplutură, este teoretic posibil să avem sizeof (short int) > sizeof (int), , dar este foarte puțin probabil. –  > Por Keith Thompson.
  • @KeithThompson, puteți detalia în ceea ce privește sizeof (short int) > sizeof (int) ? –  > Por SomeWittyUsername.
  • @icepack: Tipurile de numere întregi pot avea biți de umplutură, biți care nu contribuie la valoare. De exemplu, o implementare conformă ar putea în teorie să aibă short cu 32 de biți (dintre care 16 biți de umplutură) și int cu 24 de biți (toți semnificativi). Nu mă pot gândi la niciun motiv pentru a face o asemenea prostie, dar standardul nu o interzice. –  > Por Keith Thompson.
Lundin

În teorie/în conformitate cu standardul C, ele pot avea orice dimensiune, atâta timp cât 16 bit <= short <= int.

În lumea reală, acesta este modul în care sunt implementate dimensiunile.

CPU             short   int
8 bit           16      16
16 bit          16      16
32 bit          16      32
64 bit          16      32

Comentarii

  • Ați verificat în ansi c în linux pe 64 de biți și în visual studio în window pe 64 de biți vreau doar să știu… -.  > Por Bharat Sharma.
  • @BharatSharma 64 de biți face o diferență doar în ceea ce privește dimensiunile de long și long long. Se pare că unele sisteme pe 64 de biți definesc long ca fiind de 64 de biți, în timp ce alte sisteme implementează standardul C99/C11 și folosesc long long pentru 64 de biți, lăsând long ca 32 de biți. –  > Por Lundin.
  • Mulțumesc, de fapt, odată ce am găsit problema legată de long, așa că mă gândeam că ar putea fi posibil și pentru short… 🙂 –  > Por Bharat Sharma.
  • Ei nu pot fi orice dimensiune; ambele trebuie să fie de cel puțin 16 biți. BTW, am lucrat pe sisteme cu 32 de biți (Cray T3E) și 64 de biți (Cray T90). short. –  > Por Keith Thompson.
  • @Lundin Deci, este adevărat că în 64bit arch, int este același lucru cu long (ambele sunt pe 32bit)? –  > Por Benyamin Jafari.
Robbie Dee

Nu vă bazați niciodată pe faptul că un tip de date are o anumită dimensiune în C. Întotdeauna verificați limitele din limits.h dacă aveți dubii.

Comentarii

  • Cu excepția, bineînțeles, a cazului în care folosiți uint32_t și prietenii de la <stdint.h>. –  > Por unwind.
  • Aceasta face parte din standardul C99, ceea ce ne readuce la întrebarea ridicată de alții cu privire la sistemul de operare/compilatorul utilizat. –  > Por Robbie Dee.
Ciro Santilli新疆棉花TRUMP BAN BAD

Proiect de standard C99 N1256

Tot ceea ce știm cu siguranță este că:

2 <= sizeof(short) <= sizeof(int)

5.2.4.2.2.1 Dimensiuni ale tipurilor de numere întregi <limits.h> oferă dimensiunile minime:

1 […] Valorile lor definite de implementare trebuie să fie egale sau mai mari în mărime (valoare absolută) decât cele indicate […].

  • UCHAR_MAX 255 // 2 8 – 1
  • USHRT_MAX 65535 // 2 16 – 1
  • UINT_MAX 65535 // 2 16 – 1
  • ULONG_MAX 4294967295 // 2 32 – 1
  • ULLONG_MAX 1844674404073709551615 // 2 64 – 1

6.2.5 Tipuri spune atunci:

8 Pentru orice două tipuri de numere întregi cu același semn și cu rang de conversie a numerelor întregi diferit (a se vedea 6.3.1.1), intervalul de valori al tipului cu rang de conversie mai mic este un subansamblu al valorilor celuilalt tip.

și 6.3.1.1. Boolean, caractere și numere întregi determină rangurile de conversie relative:

1 Fiecare tip de număr întreg are un rang de conversie de numere întregi definit după cum urmează:

  • Rangul lui long long int este mai mare decât rangul lui long int, care este mai mare decât rangul lui int, care este mai mare decât rangul lui shortint, care este mai mare decât rangul lui signed char.
  • Rangul oricărui tip de număr întreg fără semn este egal cu rangul tipului de număr întreg cu semn corespunzător, dacă există.
  • Pentru toate tipurile de numere întregi T1, T2 și T3, dacă T1 are un rang mai mare decât T2 și T2 are un rang mai mare decât T3, atunci T1 are un rang mai mare decât T3.

YoyoS

Depinde de sistem. Unele sisteme de operare nu vor avea aceeași lungime pentru ambele tipuri.

Ljdawson

„Un număr întreg scurt într-un limbaj de programare poate avea o dimensiune diferită într-un alt limbaj sau pe un alt procesor. În unele limbaje, această dimensiune este fixă pe toate platformele, în timp ce în altele este dependentă de mașină. În unele limbaje, acest tip de date nu există deloc.”

Sursa

Comentarii

  • Dar întrebarea se referă la C. –  > Por Keith Thompson.
  • Da, iar linkul cu sursa postat arată diferența pentru C, C++, C# și Java. –  > Por Ljdawson.
  • Porțiunea pe care ai citat-o nu răspunde la întrebare. (BTW, acel paragraf a fost ulterior șters din articol).  > Por Keith Thompson.
Bharat Sharma

De fapt, totul depinde atât de compilator, cât și de sistem. Dar regula de bază spune că int nu poate fi niciodată mai mic decât short și nu poate fi mai mare decât long.

short <= int <= long

Comentarii

  • char <= short <= int <= long <= long long long. Rețineți că long long nu este acceptat în ISO C90 –  > Por Ultimater.
Mateen Maldar

Am lucrat la același lucru astăzi. Concluzia mea este că depinde de lungimea cuvântului din arhitectura mașinii pe care se execută programul dvs. conform documentației C99 limits.h.

/* Minimum and maximum values a `signed short int' can hold.  */
#  define SHRT_MIN  (-32768)
#  define SHRT_MAX  32767

/* Maximum value an `unsigned short int' can hold.  (Minimum is 0.)  */
#  define USHRT_MAX 65535

/* Minimum and maximum values a `signed int' can hold.  */
#  define INT_MIN   (-INT_MAX - 1)
#  define INT_MAX   2147483647

/* Maximum value an `unsigned int' can hold.  (Minimum is 0.)  */
#  define UINT_MAX  4294967295U

/* Minimum and maximum values a `signed long int' can hold.  */
#  if __WORDSIZE == 64
#   define LONG_MAX 9223372036854775807L
#  else
#   define LONG_MAX 2147483647L
#  endif
#  define LONG_MIN  (-LONG_MAX - 1L)

/* Maximum value an `unsigned long int' can hold.  (Minimum is 0.)  */
#  if __WORDSIZE == 64
#   define ULONG_MAX    18446744073709551615UL
#  else
#   define ULONG_MAX    4294967295UL
#  endif

Anunțați-mă dacă cineva are un răspuns mai bun.

Comentarii

  • doar pentru a adăuga încercați acest lucru –  > Por Mateen Maldar.
  • short int i = 2147483647; printf(„%d %d %d %d
    „,i, i, i+1,i+10); – –  > Por Mateen Maldar.
  • int i = 2147483647; printf(„%d %d %d %d
    „,i, i+1,i+10); –  > Por Mateen Maldar.
  • lucram pe o mașină de 64 de biți și este o observație bună pentru persoanele care testează pentru a observa problemele de rollover –  > Por Mateen Maldar.
Ajitesh Sinha

short și int trebuie să aibă cel puțin 16 biți, long trebuie să aibă cel puțin 32 de biți și că short nu este mai lung decât int, care nu este mai lung decât long. În mod obișnuit, short are 16 biți, long are 32 de biți, iar int are fie 16, fie 32 de biți.

Tags:,