Tipuri de date întregi în limbajul c. Tipuri de date în C

Această secțiune va discuta principalele tipuri de date în C++, aceste tipuri de date sunt, de asemenea, numite încorporate. Limbajul de programare C++ este un limbaj de programare extensibil. Termenul extensibil înseamnă că, pe lângă tipurile de date încorporate, vă puteți crea propriile tipuri de date. De aceea există un număr mare de tipuri de date în C++. Le vom studia doar pe cele principale.

Tabelul 1 - Tipuri de date C++
Tip octet Gama de valori acceptate

tip de date întreg (boolean).

bool 1 0 / 255

tip de date întreg (caracter).

char 1 0 / 255

tipuri de date întregi

scurt int 2 -32 768 / 32 767
nesemnat scurt int 2 0 / 65 535
int 4
nesemnat int 4 0 / 4 294 967 295
lung int 4 -2 147 483 648 / 2 147 483 647
nesemnat lung int 4 0 / 4 294 967 295

tipuri de date în virgulă mobilă

plutire 4 -2 147 483 648.0 / 2 147 483 647.0
plutire lungă 8
dubla 8 -9 223 372 036 854 775 808 .0 / 9 223 372 036 854 775 807.0

Tabelul 1 prezintă principalele tipuri de date în C++. Întregul tabel este împărțit în trei coloane. Prima coloană indică un cuvânt rezervat, care va determina, fiecare, tipul de date. A doua coloană indică numărul de octeți alocați pentru o variabilă cu tipul de date corespunzător. A treia coloană arată intervalul de valori acceptabile. Vă rugăm să rețineți că în tabel toate tipurile de date sunt aranjate de la cel mai mic la cel mai mare.

tip de date bool

Primul din tabel este tipul de date bool un tip de date întreg, deoarece intervalul de valori valide este numere întregi de la 0 la 255. Dar, după cum ați observat deja, în paranteze scrie tipul de date boolean, iar acest lucru este și adevărat. Deoarece bool folosit exclusiv pentru a stoca rezultatele expresiilor booleene. O expresie booleană poate avea unul din două rezultate: adevărat sau fals. true - dacă expresia logică este adevărată, false - dacă expresia logică este falsă.

Dar, deoarece intervalul de valori valide ale tipului de date bool este de la 0 la 255, a fost necesar să se potrivească cumva acest interval cu constantele logice adevărate și false definite în limbajul de programare. Astfel, constanta adevărată este echivalentă cu toate numerele de la 1 la 255 inclusiv, în timp ce constanta falsă este echivalentă cu un singur număr întreg - 0. Luați în considerare un program care utilizează tipul de date bool.

// data_type.cpp: Definește punctul de intrare pentru aplicația consolă. #include „stdafx.h” #include folosind namespace std; int main(int argc, char* argv) ( bool boolean = 25; // variabilă de tip bool numită boolean if (boolean) // condiția operatorului if cout<< "true = " << boolean << endl; // выполнится в случае истинности условия else cout << "false = " << boolean << endl; // выполнится в случае, если условие ложно system("pause"); return 0; }

ÎN linia 9variabilă de tip declarată bool , care este inițializat la 25. Teoretic, dupărândurile 9, într-o variabilă booleană ar trebui să conțină numărul 25, dar de fapt această variabilă conține numărul 1. După cum am spus, numărul 0 este o valoare falsă, numărul 1 este o valoare adevărată. Ideea este că într-o variabilă ca bool poate conține două valori - 0 (fals) sau 1 (adevărat). În timp ce sub tipul de date bool este alocat un octet întreg, ceea ce înseamnă că o variabilă de tip bool poate conține numere de la 0 la 255. Pentru a determina valori false și adevărate, sunt necesare doar două valori 0 și 1. Se pune întrebarea: „Pentru ce sunt celelalte 253 de valori?”

Pe baza acestei situații, am convenit să folosim numerele de la 2 la 255 ca echivalent al numărului 1, adică adevărul. Tocmai de aceea variabila booleană conține numărul 25 și nu 1. În liniile 10 -13 declarat, care transferă controlul operatorului în linia 11, dacă condiția este adevărată și operatorul în linia 13, dacă condiția este falsă. Rezultatul programului este prezentat în Figura 1.

Adevărat = 1 Pentru a continua, apăsați orice tastă. . .

Figura 1 - tipul de date bool

Tipul de date char

Tipul de date char este un tip de date întreg care este folosit pentru a reprezenta caractere. Adică, fiecărui caracter îi corespunde un anumit număr din interval. Tipul de date char este numit și tipul de date caracter, deoarece reprezentarea grafică a caracterelor în C++ este posibilă datorită char. Pentru a reprezenta caractere în C++, tipului de date char i se alocă un octet, un octet conține 8 biți, apoi ridicăm doi la puterea lui 8 și obținem valoarea 256 - numărul de caractere care pot fi codificate. Astfel, folosind tipul de date char, puteți afișa oricare dintre cele 256 de caractere. Toate caracterele codificate sunt reprezentate în .

ASCII (American Standard Code for Information Interchange) este un cod standard american pentru schimbul de informații.

Luați în considerare un program care utilizează tipul de date char.

// symbols.cpp: Definește punctul de intrare pentru aplicația consolă. #include „stdafx.h” #include folosind namespace std; int main(int argc, char* argv) ( simbolul char = "a"; // declarând o variabilă de tip char și inițialând-o cu simbolul "a" cout<< "symbol = " << symbol << endl; // печать символа, содержащегося в переменной symbol char string = "сайт"; // объявление символьного массива (строки) cout << "string = " << string << endl; // печать строки system("pause"); return 0; }

Deci, în linia 9o variabilă numită simbol , i se atribuie valoarea simbolului„a” ( cod ASCII). ÎN linia 10 operator cout tipărește caracterul conținut în variabilă simbol ÎN linia 11o matrice de șiruri numităşir , iar dimensiunea matricei este specificată implicit. Un șir este stocat într-o matrice de șiruri"site-ul web" . Vă rugăm să rețineți că atunci când am salvat simbolul într-o variabilă ca char , apoi după semnul egal punem ghilimele simple în care am scris simbolul. La inițializarea unui tablou de șiruri cu un anumit șir, ghilimelele duble sunt plasate după semnul egal, în care este scris un anumit șir. La fel ca un caracter obișnuit, șirurile sunt scoase folosind operatorul cout, linia 12. Rezultatul programului este prezentat în Figura 2.

Simbol = un șir = site Pentru a continua, apăsați orice tastă. . .

Figura 2 - tipul de date char

Tipuri de date întregi

Tipurile de date întregi sunt folosite pentru a reprezenta numere. Există șase dintre ele în tabelul 1: short int, unsigned short int, int, unsigned int, long int, unsigned long int . Toate au propria lor dimensiune de memorie și interval de valori acceptate. În funcție de compilator, dimensiunea memoriei ocupate și intervalul de valori acceptate pot varia. În tabelul 1, toate intervalele de valori acceptate și dimensiunile memoriei ocupate sunt luate pentru compilatorul MVS2010. Mai mult, toate tipurile de date din Tabelul 1 sunt aranjate în ordine crescătoare a dimensiunii memoriei ocupate și a intervalului de valori acceptate. Gama de valori acceptate, într-un fel sau altul, depinde de dimensiunea memoriei ocupate. În consecință, cu cât dimensiunea memoriei ocupate este mai mare, cu atât intervalul de valori acceptate este mai mare. De asemenea, intervalul de valori acceptate se modifică dacă tipul de date este declarat cu prefixul nesemnat. Prefixul nesemnat înseamnă că tipul de date nu poate stoca valori semnate, atunci intervalul de valori pozitive este dublat, de exemplu, tipurile de date short int și unsigned short int.

Prefixe de tip de date întregi:

scurt prefixul scurtează tipul de date la care se aplică prin reducerea dimensiunii memoriei pe care o ocupă;

lung prefixul extinde tipul de date la care se aplica prin marirea dimensiunii memoriei pe care o ocupa;

nesemnat - prefixul dublează intervalul de valori pozitive, în timp ce intervalul de valori negative nu poate fi stocat în acest tip de date.

Deci, în esență, avem un tip întreg pentru a reprezenta numerele întregi: tipul de date int. Datorită prefixelor short, long, unsigned, apare o anumită varietate de tipuri de date int, care diferă în dimensiunea memoriei ocupate și (sau) în gama de valori acceptate.

Tipuri de date în virgulă mobilă

Există două tipuri de date în virgulă mobilă în C++: float și double. Tipurile de date în virgulă mobilă sunt concepute pentru a stoca numere în virgulă mobilă. Tipurile de date float și double pot stoca atât numere cu virgulă mobilă pozitive, cât și negative. Tipul de date float are o amprentă de memorie care este jumătate față de tipul de date dublu, ceea ce înseamnă că și intervalul de valori acceptate este mai mic. Dacă tipul de date float este declarat cu prefixul lung, atunci intervalul de valori acceptate va fi egal cu intervalul de valori acceptate ale tipului de date dublu. Practic, tipurile de date în virgulă mobilă sunt necesare pentru a rezolva probleme cu calcule de mare precizie, de exemplu, tranzacții cu bani.

Deci, ne-am uitat la punctele principale privind principalele tipuri de date din C++. Tot ce rămâne este să arătăm de unde provin toate aceste intervale de valori acceptate și dimensiunile memoriei ocupate. Și pentru aceasta vom dezvolta un program care va calcula principalele caracteristici ale tuturor tipurilor de date discutate mai sus.

// data_types.cpp: Definește punctul de intrare pentru aplicația consolă. #include „stdafx.h” #include // Biblioteca de manipulare I/O #include // fișier antet al funcțiilor matematice #include folosind namespace std; int main(int argc, char* argv) ( cout<< " data type " << "byte" << " " << " max value "<< endl // anteturi de coloană <<"bool = " << sizeof(bool) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных bool*/ << (pow(2,sizeof(bool) * 8.0) - 1) << endl << "char = " << sizeof(char) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных char*/ << (pow(2,sizeof(char) * 8.0) - 1) << endl << "short int = " << sizeof(short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных short int*/ << (pow(2,sizeof(short int) * 8.0 - 1) - 1) << endl << "unsigned short int = " << sizeof(unsigned short int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned short int*/ << (pow(2,sizeof(unsigned short int) * 8.0) - 1) << endl << "int = " << sizeof(int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных int*/ << (pow(2,sizeof(int) * 8.0 - 1) - 1) << endl << "unsigned int = " << sizeof(unsigned int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных unsigned int*/ << (pow(2,sizeof(unsigned int) * 8.0) - 1) << endl << "long int = " << sizeof(long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных long int*/ << (pow(2,sizeof(long int) * 8.0 - 1) - 1) << endl << "unsigned long int = " << sizeof(unsigned long int) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных undigned long int*/ << (pow(2,sizeof(unsigned long int) * 8.0) - 1) << endl << "float = " << sizeof(float) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных float*/ << (pow(2,sizeof(float) * 8.0 - 1) - 1) << endl << "double = " << sizeof(double) << " " << fixed << setprecision(2) /*вычисляем максимальное значение для типа данных double*/ << (pow(2,sizeof(double) * 8.0 - 1) - 1) << endl; system("pause"); return 0; }

Acest program este postat astfel încât să puteți vizualiza caracteristicile tipurilor de date din sistemul dumneavoastră. Nu este nevoie să înțelegeți codul, deoarece programul folosește instrucțiuni de control cu ​​care cel mai probabil nu sunteți încă familiarizați. Pentru o cunoaștere superficială a codului programului, voi explica mai jos câteva puncte. Operator dimensiunea() Calculează numărul de octeți alocați pentru un tip de date sau variabilă. Funcţie pow(x,y) ridică sensul x la puterea lui y , această funcție este disponibilă din fișierul antet . manipulatoare fixe și setprecision(). disponibil din fișierul antet . Primul este fix , transmite valori în formă fixă ​​fluxului de ieșire. Manipulator setprecision(n) afișează n zecimale. Valoarea maximă a unui anumit tip de date este calculată folosind următoarea formulă:

Max_val_type = 2^(b * 8 - 1) - 1; // pentru tipurile de date cu numere negative și pozitive // ​​unde b este numărul de octeți alocați în memorie pentru o variabilă cu acest tip de date // se înmulțește cu 8, deoarece există 8 biți într-un octet // scade 1 în paranteze, deoarece intervalul de numere trebuie împărțit în două pentru valori pozitive și negative // ​​scădeți 1 la sfârșit, deoarece intervalul de numere începe de la zero // tipuri de date cu prefixul max_val_type fără semn = 2^(b * 8) - 1; // pentru tipurile de date numai cu numere pozitive // ​​explicațiile pentru formula sunt similare, doar unitatea nu se scade din paranteză

Un exemplu de funcționare a programului poate fi văzut în Figura 3. Prima coloană arată principalele tipuri de date în C++, a doua coloană arată dimensiunea memoriei alocate pentru fiecare tip de date, iar a treia coloană arată valoarea maximă pe care corespunzătoare. tipul de date poate conține. Valoarea minimă se găsește similară cu cea maximă. Pentru tipurile de date cu prefix nesemnat, valoarea minimă este 0.

Tip de date octet valoarea maximă bool = 1 255.00 char = 1 255.00 short int = 2 32767.00 unsigned short int = 2 65535.00 int = 4 2147483647.00 unsigned int = 4 4294967295 long = 4294967295 int = 4 4294967295,00 float = 4 2147483647,00 dublu = 8 9223372036854775808.00 Pentru a continua, apăsați orice tastă. . .

Figura 3 - Tipuri de date C++

Dacă, de exemplu, unei variabile de tip short int i se atribuie valoarea 33000, atunci grila de biți va depăși, deoarece valoarea maximă într-o variabilă de tip short int este 32767. Adică, o altă valoare va fi stocată într-o variabilă. de tip short int, cel mai probabil va fi negativ. Deoarece am atins tipul de date int, merită remarcat faptul că puteți omite cuvântul cheie int și puteți scrie, de exemplu, doar scurt . Compilatorul va interpreta o astfel de intrare ca int scurt. Același lucru este valabil și pentru prefixele lungi și nesemnate. De exemplu:

// prescurtare pentru tipul de date int short a1; // la fel ca short int long a1; // la fel ca long int unsigned a1; // la fel ca unsigned int unsigned short a1; // la fel ca unsigned short int

Un tip de date definește un set de valori, un set de operații care pot fi aplicate acelor valori și modul în care sunt stocate valorile și sunt efectuate operațiunile.

Procesul de verificare și plasare a restricțiilor asupra tipurilor de date utilizate se numește verificare de tip sau tastarea datelor programului. Se disting următoarele tipuri de tastare:

  • Tastarea statică - controlul tipului se efectuează în timpul compilării.
  • Tastare dinamică - verificarea tipului se face în timpul rulării.

Limbajul C acceptă tastarea statică, iar tipurile tuturor datelor utilizate într-un program trebuie specificate înainte de a fi compilat.

Există simple, compuse și alte tipuri de date.

Date simple

Datele simple pot fi împărțite în

  • numere întregi,
  • real,
  • simbolic
  • logic.

Date compuse (complexe).

  • Un tablou este o colecție indexată de elemente de același tip.
  • Tipul șirului este o matrice care stochează un șir de caractere.
  • Structura este un set de diferite elemente (câmpuri de înregistrare), stocate ca un întreg și care oferă acces la câmpurile individuale ale structurii.

Alte tipuri de date

  • Pointer - stochează o adresă în memoria computerului care indică anumite informații, de obicei un pointer către o variabilă.

Un program scris în limbaj C operează cu date de diferite tipuri. Toate datele au un nume și un tip. Datele din program sunt accesate prin numele lor (identificatori).

Un identificator este o secvență care nu conține mai mult de 32 de caractere, care poate include orice litere din alfabetul latin a - z, A - Z, numere 0 - 9 și litera de subliniere (_). Primul caracter al identificatorului nu trebuie să fie un număr.

Deși este permis un nume de până la 32 de caractere, doar primele 8 caractere sunt semnificative. În afară de nume, toate datele au un tip. Specificarea tipului este necesară pentru a se ști cât spațiu în RAM va ocupa obiectul dat.

Compilatorul C respectă potrivirea strictă a literelor mari și mici în numele identificatorilor și jetoanelor.

Date întregi

Datele întregi pot fi reprezentate sub formă semnată sau nesemnată.

Numerele întregi fără semn sunt reprezentate ca o secvență de biți în intervalul de la 0 la 2 n -1, unde n este numărul de biți ocupați.

numere întregi semnate sunt reprezentate în intervalul -2 n-1 …+2 n-1 -1. În acest caz, cel mai semnificativ bit al datelor este atribuit semnului numărului (0 corespunde unui număr pozitiv, 1 unui număr negativ).

Tipuri și dimensiuni de bază ale datelor întregi:

Date reale

Tip real este destinat să reprezinte numere reale. Numerele reale sunt reprezentate în grila de biți a mașinii într-o formă standardizată.

Forma normalizată a numărului presupune prezența unei cifre semnificative (nu 0) înainte de a separa părțile întregi și fracționale. Această reprezentare este înmulțită cu baza sistemului numeric la gradul corespunzător. De exemplu, numărul 12345.678 în formă normalizată poate fi reprezentat ca

12345,678 = 1,2345678 10 4

Numărul 0,009876 în formă normalizată poate fi reprezentat ca

0,009876 = 9,876·10 -3

În sistemul numeric binar, cifra semnificativă dinaintea separatorului zecimal poate fi doar egală cu 1. Dacă numărul nu poate fi reprezentat în formă standardizată (de exemplu, numărul 0), cifra semnificativă înaintea separatorului zecimal este 0.

Cifrele semnificative ale unui număr, aflate în formă normalizată după separatorul părților întregi și fracționale, sunt numite mantisa numărului.

În cazul general, un număr real din grila de biți a unui computer poate fi reprezentat ca 4 câmpuri.

  • semn— un bit care determină semnul unui număr real (0 pentru numere pozitive, 1 pentru numere negative).
  • grad— determină puterea lui 2 cu care doriți să înmulțiți un număr în formă normalizată. Deoarece puterea lui 2 pentru un număr în formă normalizată poate fi fie pozitivă, fie negativă, puterea zero a lui 2 în reprezentarea unui număr real corespunde unei valori de deplasare, care este definită ca

    unde n este numărul de cifre alocate pentru a reprezenta puterea unui număr.

  • întreg- un bit care este întotdeauna egal cu 1 pentru numerele normalizate, astfel încât în ​​unele reprezentări de tip acest bit este omis și se presupune că este egal cu 1.
  • mantisa— cifre semnificative ale reprezentării unui număr, care se află după separatorul părților întregi și fracționale într-o formă standardizată.

Există trei tipuri principale de reprezentare a numerelor reale în limbajul C:

După cum se poate vedea din tabel, tipurile float și double nu au un bit întreg. În acest caz, intervalul de reprezentare a unui număr real este format din două intervale situate simetric față de zero. De exemplu, intervalul de reprezentare a numerelor flotante poate fi reprezentat ca:

Exemplu: Reprezentați numărul -178.125 într-o grilă de 32 de biți (tip flotant).

Pentru a reprezenta un număr în sistemul de numere binar, transformăm părțile întregi și fracționale separat:

178 10 = 10110010 2 .

0,125 10 = 0,001 2 .

178,125 10 = 10110010,001 2 =1,0110010001 2 111

Pentru a converti în formă normalizată, mutați 7 biți la stânga).

Pentru a determina puterea unui număr, utilizați o schimbare:

0111111+00000111 = 10000110 .

Astfel, numărul -178.125 va fi reprezentat în grila de biți ca

Tip de caracter

Tipul de caracter stochează codul unui caracter și este folosit pentru a afișa caractere în diferite codificări. Datele de caractere sunt specificate în coduri și sunt în esență o valoare întreagă. Pentru a stoca coduri de caractere în limbajul C, este utilizat tipul de caractere.

tip boolean

Tipul boolean este folosit în operații logice, este folosit în testele de condiție algoritmică și în bucle și are două semnificații:

  • adevărat - adevărat
  • fals — — fals

Programul trebuie să declare toate datele utilizate, indicând numele și tipul acestora. O descriere a datelor trebuie să preceadă utilizarea lor în program.

Exemplu de declarare a obiectului

int n; // Variabila n de tip întreg
dublu a; // Variabila a de tip real de dublă precizie

Tipuri de date

Tipurile de date sunt deosebit de importante în C#, deoarece este un limbaj puternic tipizat. Aceasta înseamnă că toate operațiunile sunt supuse unei verificări stricte de tip de către compilator, iar operațiunile ilegale nu sunt compilate. Prin urmare, verificarea strictă a tipului elimină erorile și crește fiabilitatea programelor. Pentru a impune verificarea tipului, toate variabilele, expresiile și valorile trebuie să fie de un anumit tip. Nu există deloc o variabilă „fără tip” în acest limbaj de programare. Mai mult, tipul unei valori determină operațiunile care pot fi efectuate asupra acesteia. O operațiune care este legală pentru un tip de date poate să nu fie valabilă pentru altul.

Există două categorii generale de tipuri de date încorporate în C#: tipuri de valoriŞi tipuri de referință. Ele diferă în conținutul variabilei. Din punct de vedere conceptual, diferența dintre cele două este că un tip de valoare stochează date direct, în timp ce un tip de referință stochează o referință la o valoare.

Aceste tipuri sunt stocate în diferite locații din memorie: tipurile de valori sunt stocate într-o zonă cunoscută sub numele de stivă, iar tipurile de referință sunt stocate într-o zonă cunoscută sub numele de heap gestionat.

Să aruncăm o privire tipuri de valori.

Tipuri întregi

C# definește nouă tipuri de numere întregi: char, byte, sbyte, short, ushort, int, uint, long și ulong. Dar tipul char este folosit în primul rând pentru a reprezenta caractere și, prin urmare, este tratat separat. Restul de opt tipuri de numere întregi sunt pentru calcule numerice. Mai jos sunt gama lor de numere și adâncimea de biți:

Tipuri întregi C#
Tip Tastați CTS Dimensiunea biților Gamă
octet System.Byte 8 0:255
sbyte Sistem.SByte 8 -128:127
scurt System.Int16 16 -32768: 32767
scurt System.UInt16 16 0: 65535
int System.Int32 32 -2147483648: 2147483647
uint System.UInt32 32 0: 4294967295
lung System.Int64 64 -9223372036854775808: 9223372036854775807
ulong System.UInt64 64 0: 18446744073709551615

După cum arată tabelul de mai sus, C# definește atât variante semnate, cât și nesemnate ale diferitelor tipuri de numere întregi. Tipurile de numere întregi semnate diferă de omologii lor nesemnați în modul în care interpretează bitul cel mai semnificativ al întregului. Astfel, dacă un program specifică o valoare întreagă cu semn, compilatorul C# va genera cod care folosește cel mai semnificativ bit al întregului ca indicator de semn. Un număr este considerat pozitiv dacă semnul este 0 și negativ dacă este 1.

Numerele negative sunt aproape întotdeauna reprezentate prin metoda complementului a două, prin care toate cifrele binare ale numărului negativ sunt mai întâi inversate și apoi 1 este adăugat la acel număr.

Probabil cel mai comun tip de număr întreg în programare este tip int. Variabilele de tip int sunt adesea folosite pentru controlul buclei, indexarea matricei și calcule matematice de uz general. Când aveți nevoie de o valoare întreagă cu o gamă mai mare de reprezentări numerice decât tipul int, există o serie de alte tipuri întregi disponibile în acest scop.

Deci, dacă valoarea trebuie stocată fără semn, atunci puteți selecta pentru aceasta tip uint, pentru valori mari semnate - tip lung, iar pentru valori mari nesemnate - tastați ulong. Ca exemplu, mai jos este un program care calculează distanța de la Pământ la Soare în centimetri. Pentru a stoca o valoare atât de mare, folosește o variabilă lungă:

Utilizarea sistemului; folosind System.Collections.Generic; folosind System.Linq; folosind System.Text; namespace ConsoleApplication1 ( clasa Program ( static void Main(string args)) ( rezultat lung; const long km = 149800000; // distanță în km. rezultat = km * 1000 * 100; Console.WriteLine (rezultat); Console.ReadLine(); ) ) )

Tuturor variabilelor întregi li se pot atribui valori în notații zecimale sau hexazecimale. În acest din urmă caz, este necesar un prefix 0x:

Long x = 0x12ab;

Dacă există vreo incertitudine dacă o valoare întreagă este de tip int, uint, long sau ulong, atunci implicit int este acceptat. Pentru a specifica în mod explicit ce alt tip întreg ar trebui să aibă o valoare, următoarele caractere pot fi adăugate unui număr:

Uint ui = 1234U; lung l = 1234L; ulong ul = 1234UL;

U și L pot fi scrise și cu litere mici, deși un L mic poate fi ușor confundat vizual cu numărul 1 (unu).

Tipuri în virgulă mobilă

Tipurile cu virgulă mobilă vă permit să reprezentați numere cu o parte fracțională. Există două tipuri de tipuri de date în virgulă mobilă în C#: plutireŞi dubla. Ele reprezintă valori numerice cu precizie simplă și, respectiv, dublă. Astfel, lățimea tipului float este de 32 de biți, ceea ce corespunde aproximativ intervalului de reprezentare a numerelor de la 5E-45 la 3.4E+38. Și lățimea tipului dublu este de 64 de biți, ceea ce corespunde aproximativ intervalului de reprezentare a numerelor de la 5E-324 la 1.7E+308.

Tipul de date float este destinat valorilor mai mici în virgulă mobilă care necesită mai puțină precizie. Tipul de date dublu este mai mare decât float și oferă un grad mai mare de precizie (15 biți).

Dacă în codul sursă este codificată o valoare non-întreg (de exemplu, 12.3), atunci compilatorul presupune de obicei că este intenționată o valoare dublă. Dacă valoarea trebuie să fie specificată ca un float, va trebui să-i adăugați caracterul F (sau f):

Float f = 12,3F;

Tip de date zecimal

De asemenea, este furnizat un tip zecimal pentru a reprezenta numere în virgulă mobilă de înaltă precizie. zecimal, care este destinat utilizării în calcule financiare. Acest tip are o lățime de 128 de biți pentru a reprezenta valori numerice cuprinse între 1E-28 și 7.9E+28. Probabil știți că aritmetica obișnuită în virgulă mobilă este predispusă la erori de rotunjire zecimală. Aceste erori sunt eliminate prin utilizarea tipului zecimal, care permite reprezentarea numerelor cu 28 (și uneori 29) zecimale. Deoarece acest tip de date poate reprezenta valori zecimale fără erori de rotunjire, este util în special pentru calculele financiare:

Utilizarea sistemului; folosind System.Collections.Generic; folosind System.Linq; folosind System.Text; namespace ConsoleApplication1 ( class Program ( static void Main(string args)) ( // *** Calculul costului unei investiții cu *** // *** rata fixă ​​de rentabilitate*** zecimală bani, procent; int i; const byte ani = 15 ;

Rezultatul acestui program va fi:

Simboluri

În C#, caracterele sunt reprezentate nu în cod de 8 biți, ca în multe alte limbaje de programare, cum ar fi C++, ci în cod de 16 biți, numit Unicode. Setul de caractere Unicode este atât de larg încât acoperă caractere din aproape fiecare limbă naturală din lume. În timp ce multe limbi naturale, inclusiv engleză, franceză și germană, au alfabete relativ mici, unele alte limbi, cum ar fi chineza, folosesc seturi de caractere destul de mari care nu pot fi reprezentate printr-un cod de 8 biți. Pentru a depăși această limitare, C# definește tip char, care reprezintă valori nesemnate de 16 biți, cuprinse între 0 și 65.535. Cu toate acestea, setul de caractere ASCII standard de 8 biți este un subset de Unicode cuprins între 0 și 127. Prin urmare, caracterele ASCII sunt încă valabile în C#.

Ultima actualizare: 17.09.2017

Fiecare variabilă are un tip specific. Și acest tip determină ce valori poate avea o variabilă, ce operații pot fi efectuate asupra ei și câți octeți în memorie va ocupa. Următoarele tipuri de date de bază sunt definite în limbajul C++:

    bool : tip boolean. Poate lua una dintre cele două valori: adevărat și fals. Amprenta de memorie pentru acest tip nu este definită cu precizie.

    char : Reprezintă un singur caracter ASCII. Ocupă 1 octet (8 biți) în memorie. Poate stoca orice valoare de la -128 la 127 sau de la 0 la 255

    signed char : reprezintă un singur caracter. Ocupă 1 octet (8 biți) în memorie. Poate stoca orice valoare de la -128 la 127

    unsigned char : Reprezintă un singur caracter. Ocupă 1 octet (8 biți) în memorie. Poate stoca orice valoare de la 0 la 255

    wchar_t : Reprezintă un caracter larg. Pe Windows ocupă 2 octeți (16 biți) de memorie, pe Linux ocupă 4 octeți (32 biți). Poate stoca orice valoare din intervalul de la 0 la 65.535 (pentru 2 octeți) sau de la 0 la 4.294.967.295 (pentru 4 octeți)

    char16_t: Reprezintă un singur caracter Unicode. Ocupă 2 octeți (16 biți) în memorie. Poate stoca orice valoare de la 0 la 65.535

    char32_t : reprezintă un singur caracter Unicode. Ocupă 4 octeți (32 de biți) în memorie. Poate stoca orice valoare de la 0 la 4.294.967.295

    scurt : Reprezintă un număr întreg în intervalul –32768 până la 32767. Ocupă 2 octeți (16 biți) de memorie.

    Acest tip are și sinonime short int, signed short int, signed short.

    unsigned short: Reprezintă un număr întreg în intervalul de la 0 la 65535. Ocupă 2 octeți (16 biți) de memorie.

    Acest tip are, de asemenea, un sinonim unsigned short int .

    int: reprezintă un număr întreg. În funcție de arhitectura procesorului, acesta poate ocupa 2 octeți (16 biți) sau 4 octeți (32 biți). Intervalul valorilor limită poate varia în consecință de la –32768 la 32767 (cu 2 octeți) sau de la -2.147.483.648 la 2.147.483.647 (cu 4 octeți). Dar, în orice caz, dimensiunea trebuie să fie mai mare sau egală cu dimensiunea tipului scurt și mai mică sau egală cu dimensiunea tipului lung

    Acest tip are sinonime semnate int și signed .

    unsigned int : Reprezintă un număr întreg pozitiv. În funcție de arhitectura procesorului, acesta poate ocupa 2 octeți (16 biți) sau 4 octeți (32 biți), și din această cauză, intervalul de valori limită poate varia: de la 0 la 65535 (pentru 2 octeți) sau de la 0 până la 4.294.967.295 (pentru 4 octeți).

    nesemnat poate fi folosit ca sinonim pentru acest tip

    lung : Reprezintă un număr întreg în intervalul -2.147.483.648 până la 2.147.483.647 Ocupă 4 octeți (32 de biți).

    Acest tip are și sinonime long int , signed long int și signed long

    unsigned long: reprezintă un număr întreg în intervalul de la 0 la 4.294.967.295. Ocupă 4 octeți (32 de biți).

    Are sinonimul unsigned long int .

    long long : reprezintă un număr întreg în intervalul -9.223.372.036.854.775.808 până la +9.223.372.036.854.775.807 Ocupă de obicei 8 octeți (64 de biți).

    Are sinonime long long int , signed long long int și signed long long .

    unsigned long long : reprezintă un număr întreg în intervalul de la 0 la 18.446.744.073.709.551.615, de obicei, 8 octeți (64 de biți).

    Are sinonimul unsigned long long int .

    float : Reprezintă un număr real cu o singură precizie în virgulă mobilă în intervalul +/- 3,4E-38 până la 3,4E+38. Ocupă 4 octeți (32 de biți) în memorie

    dublu : Reprezintă un număr real cu virgulă mobilă cu precizie dublă în intervalul +/- 1,7E-308 până la 1,7E+308. Ocupă 8 octeți (64 de biți) în memorie

    long double : reprezintă un număr real în virgulă mobilă cu precizie dublă de cel puțin 8 octeți (64 de biți). În funcție de dimensiunea memoriei ocupate, intervalul de valori valide poate varia.

    void : tip fără valoare

Astfel, toate tipurile de date, cu excepția void, pot fi împărțite în trei grupuri: caracter (char, wchar_t, char16_t, char32_t), întreg (short, int, long, long long) și tipuri de numere în virgulă mobilă (float, double, long double).

Tipuri de caractere

Tipurile folosite pentru a reprezenta caracterele în aplicație sunt char, wchar_t, char16_t și char32_t.

Să definim mai multe variabile:

Char c="d"; wchar_t d="c";

O variabilă char ia ca valoare un caracter între ghilimele simple: char c ="d" . De asemenea, puteți atribui un număr din intervalul specificat mai sus în listă: char c = 120 . În acest caz, valoarea variabilei c va fi caracterul care are codul 120 în tabelul de caractere ASCII.

Merită să luați în considerare faptul că pentru a scoate caractere wchar_t în consolă, ar trebui să utilizați nu std::cout, ci fluxul std::wcout:

#include int main() ( char a = "H"; wchar_t b = "e"; std::wcout<< a << b << "\n"; return 0; }

În acest caz, fluxul std::wcout poate funcționa atât cu char cât și cu wchar_t. Și fluxul std::cout pentru variabila wchar_t va scoate codul său numeric în loc de un caracter.

Standardul C++11 a adăugat tipurile char16_t și char32_t, care sunt orientate spre utilizarea Unicode. Cu toate acestea, firele pentru lucrul cu aceste tipuri nu au fost încă implementate la nivel de sistem de operare. Prin urmare, dacă trebuie să afișați valorile variabilelor de aceste tipuri pe consolă, trebuie să convertiți variabilele în tipurile char sau wchar_t:

#include int main() ( char a = "H"; wchar_t b = "e"; char16_t c = "l"; char32_t d = "o"; std::cout<< a << (char)b << (char)c << (char)d << "\n"; return 0; }

În acest caz, la ieșire, variabilele sunt precedate de o operație de turnare la tipul char - (char), datorită căreia valorile variabilelor b, c și d sunt convertite în tipul char și pot fi scoase la consola folosind fluxul std::cout.

Tipuri întregi

Tipurile întregi sunt reprezentate de următoarele tipuri: short, unsigned short, int, unsigned int, long, unsigned long, long long și unsigned long long:

a scurtă = -10; scurt nesemnat b= 10; int c = -30; unsigned int d = 60; lung e = -170; nesemnat lung f = 45; lung lung g = 89;

Tipuri de numere în virgulă mobilă

Tipurile de numere în virgulă mobilă și fracțională sunt reprezentate prin float, double și long double:

Float a = -10,45; dublu b = 0,00105; lung dublu c = 30,890045;

Dimensiunile tipului de date

Lista de mai sus arată pentru fiecare tip dimensiunea pe care o ocupă în memorie. Cu toate acestea, merită remarcat faptul că dezvoltatorii de compilatoare pot alege limitele de dimensiune pentru tipuri în mod independent, în funcție de capacitățile hardware ale computerului. Standardul stabilește doar valorile minime care ar trebui să fie. De exemplu, pentru tipurile int și short valoarea minimă este de 16 biți, pentru tipul lung - 32 de biți, pentru tipul long dublu. În acest caz, dimensiunea tipului lung nu trebuie să fie mai mică decât dimensiunea tipului int, iar dimensiunea tipului int nu trebuie să fie mai mică decât dimensiunea tipului scurt, iar dimensiunea tipului dublu lung trebuie să fie fi mai mare decât dublu. De exemplu, compilatorul g++ pentru Windows folosește 12 octeți pentru dubluri lungi, iar compilatorul încorporat în Visual Studio și rulează și sub Windows folosește 8 octeți pentru dubluri lungi. Adică, chiar și în cadrul aceleiași platforme, diferiți compilatori pot avea abordări diferite ale dimensiunilor anumitor tipuri de date. Dar, în general, se folosesc dimensiunile indicate mai sus atunci când descriem tipurile de date.

Cu toate acestea, există situații în care este necesar să se cunoască exact dimensiunea unui anumit tip. Și pentru aceasta, C++ are operatorul sizeof(), care returnează dimensiunea memoriei în octeți pe care o ocupă variabila:

#include int main() (număr dublu lung = 2; std::cout<< "sizeof(number) =" << sizeof(number); return 0; }

Ieșire din consolă la compilarea în g++:

dimensiunea (număr) = 12

În același timp, atunci când definiți variabile, este important să înțelegeți că valoarea unei variabile nu trebuie să depășească limitele conturate pentru tipul acesteia. De exemplu:

Număr scurt nesemnat = -65535;

Compilatorul G++, la compilarea unui program cu această linie, va genera o eroare care afirmă că valoarea -65535 nu se află în intervalul de valori valide pentru tipul scurt nesemnat și va fi trunchiată.

În Visual Studio, compilarea poate continua fără erori, dar variabila număr va primi valoarea 2 - rezultatul conversiei numărului -65535 într-un tip scurt nesemnat. Adică, din nou, rezultatul nu va fi exact cel așteptat. Valoarea unei variabile este doar o colecție de biți din memorie care sunt interpretați în funcție de un anumit tip. Și pentru diferite tipuri, același set de biți poate fi interpretat diferit. Prin urmare, este important să luați în considerare intervalele de valori pentru un anumit tip atunci când atribuiți o valoare unei variabile.

specificator automat

Uneori poate fi dificil să se determine tipul de expresie. Și conform celor mai recente standarde, puteți lăsa compilatorul să deducă tipul obiectului în sine. Și specificatorul automat este folosit pentru asta. Mai mult, dacă definim o variabilă cu specificatorul auto, această variabilă trebuie inițializată cu o anumită valoare:

Număr automat = 5;

Pe baza valorii atribuite, compilatorul va deduce tipul variabilei. Variabilele neinițializate cu specificatorul automat nu sunt permise.

Variabilele sunt folosite pentru a stoca diverse date în limbaje de programare. O variabilă este o zonă de memorie care are un nume, altfel numit identificator.

Dând un nume unei variabile, programatorul numește în același timp zona de memorie în care valorile variabilei vor fi scrise pentru stocare.

Este un stil bun să numești variabilele în mod semnificativ. Este permisă utilizarea literelor mici și mari, a cifrelor și a liniuței de subliniere, care este considerată o literă în C. Primul caracter trebuie să fie o literă și nu trebuie să existe spații în numele variabilei. În versiunile moderne ale compilatoarelor, lungimea numelui este practic nelimitată. Numele variabilei nu poate corespunde cuvintelor cheie rezervate. Literele mari și mici din numele variabilelor sunt diferite, variabile oŞi O- variabile diferite.

Cuvinte cheie rezervate auto double int struct break else lung comutare registru tupedef char extern return void case float unsigned implicit pentru uniunea semnată do if sizeof volatile continue enumerarea scurtă
În C, toate variabilele trebuie declarate. Aceasta înseamnă că, în primul rând, la începutul fiecărui program sau funcție trebuie să furnizați o listă cu toate variabilele utilizate și, în al doilea rând, să indicați tipul fiecăreia dintre ele.

Când o variabilă este declarată, compilatorul îi alocă spațiu de memorie în funcție de tipul acesteia. Folosind instrumente standard AVR GCC, funcționează cu tipuri de date char(tip de caracter) și int(tip întreg).

Tipuri variabile

Tastați char

char- este cel mai economic tip. Tipul de caracter poate fi semnat sau nesemnat. Notat în consecință ca „ semnat char„ (tip semnat) și „ nesemnat char" (tip nesemnat). Tipul semnat poate stoca valori în intervalul de la -128 la +127. Unsigned - de la 0 la 255. O variabilă char are 1 octet de memorie (8 biți).

Cuvinte cheie (modificatoare) semnatŞi nesemnat indicați modul în care este interpretat bitul zero al variabilei declarate, adică dacă este specificat cuvântul cheie fără semn, atunci bitul zero este interpretat ca parte a unui număr, în caz contrar bitul zero este interpretat ca semnat.

Tastați int

Valoare întreagă int Pot fi scurt(scurt) sau lung(lung).

Cuvânt cheie (modificator) scurt plasat după cuvinte cheie semnat sau nesemnat. Astfel, se disting următoarele tipuri: signed short int, unsigned short int, signed long int, unsigned long int.

Variabila de tip semnat scurt int(întreg scurt cu semn) poate lua valori de la -32768 la +32767, nesemnat scurt int(întreg scurt fără semn) - de la 0 la 65535. Pentru fiecare dintre ei sunt alocați exact doi octeți de memorie (16 biți).

La declararea unei variabile de tip semnat scurt int cuvinte cheie semnatŞi scurt poate fi omis, iar un astfel de tip de variabilă poate fi declarat simplu int. De asemenea, este posibil să declarați acest tip cu un singur cuvânt cheie scurt.

Variabilă nesemnat scurt int poate fi declarat ca nesemnat int sau scurt nesemnat.

Pentru fiecare dimensiune semnat lung int sau nesemnat lung int Sunt alocați 4 octeți de memorie (32 de biți). Valorile variabilelor de acest tip pot fi în intervalele de la -2147483648 la 2147483647 și, respectiv, de la 0 la 4294967295.

Există și variabile precum lung lung int, pentru care sunt alocați 8 octeți de memorie (64 de biți). Ele pot fi, de asemenea, semnate sau nesemnate. Pentru un tip semnat, intervalul de valori este de la -9223372036854775808 la 9223372036854775807, pentru un tip nesemnat - de la 0 la 18446744073709551615. Un tip semnat poate fi declarat pur și simplu prin două cuvinte cheie lung lung.

Tip Gamă Gama hexagonală Dimensiune
nesemnat char 0 ... 255 0x00...0xFF 8 biți
semnat char
sau doar
char
-128 ... 127 -0x80...0x7F 8 biți
nesemnat scurt int
sau doar
nesemnat int sau scurt nesemnat
0 ... 65535 0x0000 ... 0xFFFF 16 biți
semnat scurt int sau semnat int
sau doar
scurt sau int
-32768 ... 32767 0x8000 ... 0x7FFF 16 biți
nesemnat lung int
sau doar
nesemnat lung
0 ... 4294967295 0x00000000 ... 0xFFFFFFFF 32 de biți
semnat lung
sau doar
lung
-2147483648 ... 2147483647 0x80000000 ... 0x7FFFFFFF 32 de biți
nesemnat lung lung 0 ... 18446744073709551615 0x0000000000000000 ... 0xFFFFFFFFFFFFFFFFFF pe 64 de biți
semnat lung lung
sau doar
lung lung
-9223372036854775808 ... 9223372036854775807 0x8000000000000000 ... 0x7FFFFFFFFFFFFFFFF pe 64 de biți

Variabilele sunt declarate într-o declarație. O instrucțiune de declarație constă dintr-o specificație de tip și o listă de nume de variabile separate prin virgulă. Trebuie să existe un punct și virgulă la sfârșit.

O declarație de variabilă are următorul format:

[modificatoare] tip_specificator identificator [, identificator] ...

Modificatori- cuvinte cheie semnat, nesemnat, scurt, lung.
Specificator de tip- cuvânt cheie char sau int, care determină tipul variabilei declarate.
Identificator- numele variabilei.

Exemplu: char x;
int a, b, c; nesemnat long long y;, o, În acest fel variabilele vor fi declarate, x, b c nesemnat long long y; y o, În acest fel variabilele vor fi declarate, x. La o variabilă b- de la 0 la 18446744073709551615.

Inițializarea valorii unei variabile la declarare

Când este declarată, o variabilă poate fi inițializată, adică i se poate atribui o valoare inițială. Puteți face acest lucru după cum urmează. nesemnat long long y; int x = 100; Astfel, în variabilă

Când este anunțat, numărul 100 va fi imediat notat.

Este mai bine să evitați amestecarea variabilelor inițializate într-o singură declarație, adică este mai bine să declarați variabilele inițializate pe linii separate.

constante O variabilă de orice tip poate fi declarată nemodificabilă. Acest lucru se realizează prin adăugarea cuvântului cheie const O variabilă de orice tip poate fi declarată nemodificabilă. Acest lucru se realizează prin adăugarea cuvântului cheie la specificatorul de tip. Variabile cu tip O variabilă de orice tip poate fi declarată nemodificabilă. Acest lucru se realizează prin adăugarea cuvântului cheie sunt date numai pentru citire, ceea ce înseamnă că variabilei nu i se poate atribui o nouă valoare. Dacă după cuvânt int sau lung int Dacă nu există un specificator de tip, atunci constantele sunt tratate ca valori semnate și li se atribuie un tip intîn funcție de valoarea constantei: dacă constanta este mai mică de 32768, atunci i se atribuie tipul lung int.

, altfel Exemplu: const long int k = 25; const m = -50; // implicit const int m=-50

const n = 100000;

// implicit const long int n=100000

Misiunea
Semnul „=" este folosit pentru atribuire în C. Se evaluează expresia din dreapta semnului de atribuire, iar valoarea rezultată este atribuită variabilei din stânga semnului de atribuire. În acest caz, valoarea anterioară stocată în variabilă este ștearsă și înlocuită cu una nouă.

Operatorul „=" nu trebuie înțeles ca egalitate. De exemplu, expresia a = 5; ar trebui citit ca „atribuiți variabila a la 5”. Exemple: x = 5 + 3; // adăugați valorile 5 și 3, // atribuiți rezultatul variabilei x (scrieți variabilei x) b = a + 4; // adăugați 4 la valoarea stocată în variabila a, // atribuiți rezultatul rezultat variabilei b (scrieți variabilei b)
b = b + 2;

// adăugați 2 la valoarea stocată în variabila b, // atribuiți rezultatul rezultat variabilei b (scrieți variabilei b) În partea dreaptă, valoarea variabilei poate fi folosită de mai multe ori: c = b * b + 3 * b; Exemplu: x = 3; // variabilei x i se va atribui valoarea 3 y = x + 5; // numărul 5 va fi adăugat la valoarea stocată în variabila x, // rezultatul rezultat va fi scris în variabila y z = x * y; // valorile variabilelor x și y vor fi înmulțite, // rezultatul va fi scris în variabila z
z = z - 1; // 1 va fi scăzut din valoarea stocată în variabila z // rezultatul va fi scris în variabila z Astfel, în variabila

Pe lângă operatorul simplu de atribuire „=", există mai mulți operatori de atribuire combinați în C: „+=", "-=", "*=
Exemple: x += y; // la fel ca x = x + y; - se adaugă x și y // și se scrie rezultatul la variabila x x -= y; // la fel ca x = x - y; - se scade valoarea y din x // si se scrie rezultatul in variabila x x *= y; // la fel ca x = x * y; - înmulțiți x cu y // și scrieți rezultatul în variabila x x /= y; // la fel ca x = x / y; - împărțiți x la y // și scrieți rezultatul în variabila x x %= y; // la fel ca x = x % y;

// se calculează restul întreg la împărțirea x la y // și se scrie rezultatul în variabila x

Creștere și descreștere Dacă trebuie să modificați valoarea unei variabile la 1, atunci utilizați sau creştere.

scăderea Creştere

- operația de creștere a valorii stocate într-o variabilă cu 1. Exemplu: x++;// valoarea variabilei x va fi mărită cu 1
$WinAVR = ($_GET["avr"]); if($WinAVR) include($WinAVR);?> Decrementează

- operatia de scadere a valorii stocate intr-o variabila cu 1. Exemplu: x--;
// valoarea variabilei x va fi redusă cu 1

Creșterea și descreșterea sunt operatori de atribuire. Când utilizați decrementarea și creșterea împreună cu operatorul de atribuire "=", utilizați notația postfix (x++) sau prefix (++x). Prefixul este executat mai întâi.
Exemple: y = x++; nesemnat long long y; Să presupunem că în variabilă b valoarea 5 a fost stocată nesemnat long long y; se va scrie valoarea 5, după care valoarea variabilei b va fi majorat cu 1. Astfel, in nesemnat long long y; va fi 5, iar în
- 6. y = --x; nesemnat long long y; Dacă în nesemnat long long y; Dacă valoarea 5 a fost stocată, atunci decrementarea va fi efectuată mai întâi b la 4 și apoi această valoare va fi atribuită variabilei nesemnat long long y;Şi b. Astfel,