liczby całkowite w C -interpretacja słów autora

0

Książka Język C Wskaźniki Vademecum profesjonalisty

Zgodnie z nazwami, „długa liczba całkowita” powinna być w stanie przechowywać większy zakres wartości niż „krótka liczba całkowita”, ale założenie to nie musi być prawdziwe. Zasada rządząca względną wielkością liczb całkowitych jest prosta:

Długie (long) liczby całkowite są co najmniej tak długie jak liczby całkowite (int), które z kolei są co najmniej tak długie jak krótkie(short) liczby całkowite.

Nie wiem czy dobrze wnioskuje z powyższej zasady ? Może zaistnieć sytuacja że wszystkie typy long, int i short mają taki sam zakres- długość. Tylko dlaczego autor pisze dalej, że:
Typ sort int musi mieć co najmniej 16 bitów, natomiast long int, co najmniej 32 bity. Od konkretnej implementacji zależy czy typ int będzie miał 16 bitów, 32 bity,czy całkiem inną wielkość. Trzeba pamiętać, że nadal nie jest wymagane, by te trzy wielkości miały być różne.

Pozdrawiam

6

To nie jest jedna zasada, ale dwie, niezależne. Prawdą jest, że int nie może być krótszy od shorta, a long nie może być krótszy od inta, ale to nie są jedyne ograniczenia na rozmiar tych zmiennych — są jeszcze ograniczenia na rozmiar każdej z osobna. I tak: short i int muszą mieć co najmniej 16 bitów, long musi mieć co najmniej 32 bity, a long long — 64.

Więc tak, short, int i long mogą być tej samej długości — jeśli ta długość to co najmniej 32 bity. Ale mogą być i różnej — np. w modelu LP64 (MacOS, 64-bitowy Linux, itd.) short ma 16 bitów, int 32, a long 64.

4
crispia napisał(a):

Tylko dlaczego autor pisze dalej, że:
Typ sort int musi mieć co najmniej 16 bitów, natomiast long int, co najmniej 32 bity. Od konkretnej implementacji zależy czy typ int będzie miał 16 bitów, 32 bity,czy całkiem inną wielkość. Trzeba pamiętać, że nadal nie jest wymagane, by te trzy wielkości miały być różne.

Autor tak pisze, bo tak stanowi standard języka C, opisywanego w nadmienionej książce.
Mam nadzieję że pomogłem :)

2

Używaj typów o gwarantowanym rozmiarze to nie będzie konfuzji https://www.cplusplus.com/reference/cstdint/

1

To ma bliskie odniesienie do procesorów.
Na procesorach "nieco ambitniejszych" koszty obliczeń np 32bit są tak małe, że to jest naturalny typ 'int' (a nawet w złośliwych przypadkach koszty 16bit mogą być większe)
Na bardzo starych 8086 int był 16bitowy (i miał naturalną implementację, część op. 32bit miała też), na jeszcze słabszych (8080, Z80) tez 16bit, bo standard narzuca, ale niewiele z operacji było natywnych, raczej sekwencjami kodu.

3
several napisał(a):

Używaj typów o gwarantowanym rozmiarze to nie będzie konfuzji https://www.cplusplus.com/reference/cstdint/

Typy o gwarantowanym rozmiarze są potrzebne głównie gdy zapisujemy jakieś dane do pliku, albo wysyłamy po sieci…
ale w większości przypadków wystarczy zwykły int, bez zastanawiania się ile ma bitów albo z założeniem że są to 32 bity i olaniem egzotycznych architektur gdzie int jest inny.

5

@Azarien pozwolę sobie wynieść z komentarzy

przecież większość kodu w C i C++ używa po prostu zwykłych intów.

Przekleństwo, które z dobrym skutkiem tępie na pull requestach od drugiego roku mojej zawodowej kariery. Olewanie rozmiaru prymitywów to proszenie się o problemy porównywalne z niezerowaniem wskaźnika po zwolnieniu przynależnego do niego zasobu.

Prosty int jest jeszcze używany w starych bibliotekach C gdzie oprócz wartości zwrotnej chce się jednocześnie przemycić status operacji. int to taki sam przeżytek jak goto - przydatny czasem w bardzo specyficznych sytuacjach, ale na pewno nie powinien być uznawany za domyślną technikę na produkcji

Podobnie do mnie myślą autorzy współczesnych języków natywnych jak Rust czy ZIG. Zdecydowanie bardziej wolę oswajać się z krótkimi nazwami typów i16, i32, u8 niż tłumaczyć kolejny raz na pull requescie benefity używania konkretnych rozmiarowo typów pod aktualne potrzeby.

0

Korzystając z okazji mam jeszcze jedno lamerskie pytanie. Jestem biegunowo odmienny od informatyki dlatego proszę o wyrozumiałość.
W wymienionej książce: Język C Wskaźniki Vademecum profesjonalisty znajduje się następujący przykład

Zostaje zadeklarowana zmienna float c=3,14:
A w komórce pamięci znajduje się wartość 10985467
Autor wyjaśnia to tak:
Zmienna ta zawiera po prostu sekwencje bitów 0 i 1. Mogą być zinterpretowane jako liczby zmiennoprzecinkowe jak i całkowite w zależności od sposobu użycia.[…]
Typ wartości nie może być określony jedynie przez sprawdzenie sekwencji bitów. Aby określić typ( przez to także wartość )należy uwzględnić sposób wykorzystania zmiennej w programie.

Jak to możliwe by po deklaracji float w pamieci znalazła się wartość int.

Z góry dziękuję za pomoc. Pozdrawiam

3

Dawno dawno temu kupiłem coś co w tytule miało Vademecum i to były najgorzej wydane pieniądze na książkę.
Opis tego problem powinien być taki:
Zmienna float c = 3.14; na platformie, której procesor używa standardu liczb zmiennoprzecinkowych IEEE 754, zmienna będzie reprezentowana jako sekwencja bajtów: c3 f5 48 40 (binarnie 11000011 11110101 01001000 01000000).

A potem opis cecha mantysa znak i wyjaśnienie jak w tym standardzie działają liczby zmiennoprzecinkowe.
https://godbolt.org/z/PTYjvzvev
https://pl.wikipedia.org/wiki/IEEE_754

0

Int po prostu minimalnie ma 16 bitów.

long int gwarantuje 32 bity. Nie pamiętam czy 32 czy >= 32

Przy flagach często używa się zmiennej int. Albo jak łapiesz errno.
Tam gdzie funkcja zwraca, najrozsądniejsze wyjście.

Natomiast jak robisz jakieś operacje na liczbach albo zakładasz konkretny rozmiar
to najbezpieczniej jest używać stdint .h( uint8_t int32_t etc)

Jest trochę kodu który zakłada int = 32. Ale nie powinno się tak robić.

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