Z czego wynika dolny i górny zakres typów liczbowych?

0

Witam. Mam pytanie skąd się bierze zakres np. typu int -2^31÷ 2^31 - 1

0

Ale co konkretnie się skąd bierze?

0

ten zakres dla int [-2147483648, 2147483647] jak obliczać?

hauleth napisał(a):

Ale co konkretnie się skąd bierze?

1

@Nikto0: Jeśli mnie pamięć nie myli to są zdefiniowane w limits.h. Jeśli chcesz drążyć dalej to, pewnego razu mądre głowy stwierdziły, ze taka wielkość dla int jest wystarczająca, ot cała historia

2

Co to znaczy, jak obliczać. Tutaj nie ma nic do obliczania.

4

@Nikto0: Integer ma rozmiar 4 bajtów, 4 bajty to 32 bity, czyli mamy możliwość zapisania maksymalnie liczb:

  • 2^32 jeżeli jest to typ bezznakowy
  • (- 2^31) : 2^31 - 1 jeżeli to typ znakowy (-1 z powodu zera)
3
Eldorad O. napisał(a):

@Nikto0: Integer ma rozmiar 4 bajtów, 4 bajty to 32 bity, czyli mamy możliwość zapisania maksymalnie liczb:

  • 2^32 jeżeli jest to typ bezznakowy
  • (- 2^31) : 2^31 - 1 jeżeli to typ znakowy (-1 z powodu zera)

Możesz pokazać źródło tych rewelacji? Standard określa to nieco inaczej. Nie ma gwarancji, że int będzie 32 bitowy.

https://en.cppreference.com/w/cpp/language/types
Piszą jasno, że:

int - basic integer type. The keyword int may be omitted if any of the modifiers listed below are used. If no length modifiers are present, it's guaranteed to have a width of at least 16 bits. However, on 32/64 bit systems it is almost exclusively guaranteed to have width of at least 32 bits (see below).

Zakłożenia co do rozmiaru inta są mało rozsądne. Od tego są inne, dedykowane typy, często specyficzne dla danego kompilatora. Nie wkładajmy do głów początkującym niepełnych informacji.

Poza tym skąd się bierze dokładnie wzór (- 2^31) : 2^31 - 1. Napisałbyś coś więcej niż suchy wzór. Odpowiedź jest w sposobie zapisu danych. Można poczytać o tym tu https://pl.wikipedia.org/wiki/Kod_uzupe%C5%82nie%C5%84_do_dw%C3%B3ch

0
Mr.YaHooo napisał(a):

Możesz pokazać źródło tych rewelacji? Standard określa to nieco inaczej. Nie ma gwarancji, że int będzie 32 bitowy.

Podobnie jak nie ma gwarancji (choć statystycznie raczej tak) że będzie w dominujacej obecnie implementacji bitowej. Znalazł by żyjący na rynku procesor (nie mówię,że współczesny), gdzie jest inaczej.

3
Nikto0 napisał(a):

ten zakres dla int [-2147483648, 2147483647] jak obliczać?

hauleth napisał(a):

Ale co konkretnie się skąd bierze?

Google: kod uzupełnień do dwóch

0

Pozostaje czekać na pytanie "Co to jest system dwójkowy?" :(

1
ZrobieDobrze napisał(a):
Mr.YaHooo napisał(a):

Możesz pokazać źródło tych rewelacji? Standard określa to nieco inaczej. Nie ma gwarancji, że int będzie 32 bitowy.

Podobnie jak nie ma gwarancji (choć statystycznie raczej tak) że będzie w dominujacej obecnie implementacji bitowej. Znalazł by żyjący na rynku procesor (nie mówię,że współczesny), gdzie jest inaczej.

To bardziej kwestia kompilatora niż procesora. Kompilator SDCC traktuje int jako liczbę 16-bit, kompiluje do różnych mikroprocesorów. ZTCW, niektóre z nich żyją na rynku. Procesory MCS51 i Z80 wraz z pochodnymi to już przeżytek, a co do pozostałych, to nie wiem. Teoretycznie, nic nie stoi na przeszkodzie, żeby istniał kompilator C na te same procesory, dla których int jest liczbą 64-bit.

Kompilator Atmel Studio do 8-bitowych procesorów Atmega32 i pochodnych, również chyba traktuje int jako 16-bit, ale tego nie jestem pewien. Atmega32 żyje i ma się dobrze na rynku.

Co więcej, typ char (liczba 8-bit) nie jest jednoznaczny w kontekście znaku mimo, że powszechnie przyjmuje się, że jest to liczba 8-bit ze znakiem. Wymieniony kompilator SDCC do którejś wersji char traktował domyślnie jako ze znakiem, a od którejś wersji traktuje jako bez znaku. Sam to przerabiałem, gdy szukałem przyczyny, dlaczego pewien program przestał poprawnie działać po aktualizacji tego kompilatora. Aby jednoznacznie ustalić znak, trzeba podać signed char lub unsigned char.

1 użytkowników online, w tym zalogowanych: 0, gości: 1