Typy uint i przedrostki

Odpowiedz Nowy wątek
2020-03-26 22:01

Rejestracja: 1 tydzień temu

Ostatnio: 1 dzień temu

0

Mam pytanie dotyczące zasad dobrego programowania. Po pierwsze jak definiować poprawnie typ uint32? Jeżeli int i long ma taką samą długość (np. 32 bity), powinienem użyć

typedef unsigned long uint32

czy

typedef unsigned int uint32

Druga sprawa, czy dobrą praktyką jest przy zapisywaniu wartości do zmiennej używanie przyrostków (U, UL) i warto się tego trzymać?

edytowany 1x, ostatnio: kq, 2020-03-26 22:17
powinienes skorzystać z gotowych typów np uint32_t inaczej jest niebezpieczeństwo, że int i long mogą nie mieć takiej samej długości, bo nie muszą... - kaczus 2020-03-27 08:34

Pozostało 580 znaków

2020-03-27 00:59

Rejestracja: 1 tydzień temu

Ostatnio: 1 dzień temu

0
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;

uint8 var1 = 10U;
uint16 var2 = 10;
uint32 var3 = 10UL;

Czy przyrostki w literałach powyżej są użyte poprawnie?

EDIT: Czy w ogóle ma sens używanie przyrostków w literałach? Czy raczej definiując makro lub np. podczas porównywania zmiennej z liczbą?

if(var3 < 15UL)
edytowany 1x, ostatnio: rafcio100, 2020-03-27 01:02

Pozostało 580 znaków

2020-03-27 01:05

Rejestracja: 3 lata temu

Ostatnio: 11 minut temu

2

Ale te typedefy to sa do dupy no..
stdint Ci daje typy za darmo


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110
edytowany 1x, ostatnio: stivens, 2020-03-27 01:06

Pozostało 580 znaków

2020-03-27 01:06

Rejestracja: 1 tydzień temu

Ostatnio: 1 dzień temu

0

Kwestia użycia tego w projekcie, w którym pracuję :) to nie jest mój wymysł... teraz mi chodzi o kwestię, jak poprawnie operować na tak zdefiniowanych typach.

2020-03-27 01:09

Rejestracja: 3 lata temu

Ostatnio: 11 minut temu

1

Nie rozumiem... W projekcie nie potrafia zainkludowac headera?
Przeciez long ma 4 LUB 8 bajtow... (Okey, powiedzmy ze kontrakt dla uint32 spelnia :D )


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110
edytowany 2x, ostatnio: stivens, 2020-03-27 01:11

Pozostało 580 znaków

2020-03-27 01:18

Rejestracja: 3 lata temu

Ostatnio: 11 minut temu

0

Ale chodzi o nazwe czy o typedefy? Przeciez to nie problem przealiasowac jak juz formalnosci wymagaja bez _t

Edit: ale wez mi tak nie kasuj postow... Cos o AUTOSAR mowiles?


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110
edytowany 1x, ostatnio: stivens, 2020-03-27 01:18

Pozostało 580 znaków

2020-03-27 01:20

Rejestracja: 1 tydzień temu

Ostatnio: 1 dzień temu

1

AUTOSAR wymaga mapowania na typy ANSI C
https://www.autosar.org/filea[...]AUTOSAR_SWS_PlatformTypes.pdf

EDIT: Tak, przepraszam, chciałem przeredagować post :)

edytowany 1x, ostatnio: rafcio100, 2020-03-27 01:20
Pokaż pozostałe 11 komentarzy
Ale moze kompilatory, ktore stosujecie w automotive sa bardziej konserwatywne i tam long zawsze ma 4 bajty (to by eliminowalo problem) - stivens 2020-03-27 10:54
Sprawdzałem zachowanie overflow signed w CodeBlocks z GNU GCC i licznik po prostu się kręci. Kiedy może się zachować inaczej, skoro signed overflow jest UB? - rafcio100 2020-03-27 11:34
UB to znaczy, ze standard niczego nie wymaga a nie, ze komputer wybuchnie - stivens 2020-03-27 11:36

Pozostało 580 znaków

2020-03-27 12:43

Rejestracja: 4 lata temu

Ostatnio: 14 minut temu

2
rafcio100 napisał(a):
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;

uint8 var1 = 10U;
uint16 var2 = 10;
uint32 var3 = 10UL;

Czy przyrostki w literałach powyżej są użyte poprawnie?

EDIT: Czy w ogóle ma sens używanie przyrostków w literałach? Czy raczej definiując makro lub np. podczas porównywania zmiennej z liczbą?

if(var3 < 15UL)

„Poprawnie”, to znaczy? Skompiluje się, jest zgodne ze standardem, nawet Cię pewnie kompilator nie okrzyczy, jak nie ma ustawionych wybitnie wysokich flag ostrzeżeń. Ale U to przyrostek dla unsigned int lub unsigned long (być może też i dla unsigned long long, nie jestem pewien, czy któryś z nowych standardów C też to podjął), choć u Ciebie jest unsigned char — przy czym, z tego co wiem, nie ma przyrostków dla unsigned char; brak przyrostka to int lub long int (ew. long long int, patrz wyżej), choć u Ciebie to unsigned short — i znowu, dla short też chyba nie ma przyrostków; i dopiero UL jest użyte w 100% tak, jak ma być.

Ale pozostaje najważniejsze pytanie, po co to robisz? Kompilator sobie zrzutuje literał jak trzeba, on nie potrzebuje tych podpowiedzi, nie wprowadzają narzutu na wykonanie kodu, a narzut na kompilację, jeśli w ogóle jest, to znacząco mniejszy, niż nawet czas na naciśnięcie pojedynczego klawisza; one są dla ludzi — więc musisz się zastanowić Ty i Twoi współpracownicy, co Wam to właściwie podpowiada? Czy faktycznie Wam jest lepiej z tym, czy może bez tego?

edytowany 1x, ostatnio: Althorion, 2020-03-27 12:44
Pokaż pozostałe 5 komentarzy
@Althorion: to miałem na myśli - AnyKtokolwiek 2020-03-27 13:15
To przepraszam, inaczej to odczułem :) w każdym razie chcę dobrze poznać język i prezentować sobą jakiś poziom. Teraz jestem na etapie czytania "Język C. Szkoła programowania." S. Prata - rafcio100 2020-03-27 13:17
Ja się właśnie w ten sposób uczyłem i tak to właśnie powinno wyglądać — albo firma sprawdza, czy coś umiesz, i odpowiednio za to płaci, albo jesteś na entry position, z odpowiednią do tego pensją, i ktoś Ci stoi nad głową i pomaga. Jak masz całkiem samodzielną posadę, to za mało Ci płacą. Ew. jak nie masz, to za mało wymagają, co też jest ich problemem, ale za to mało prawdopodobnym… - Althorion 2020-03-27 13:17
Pracuję w korpo, w zespole, jako Junior Software Developer. Studiowałem elektronikę, język C znam tyle, ile poznałem na studiach. Moja wina, że w czasie studiów nie edukowałem się dodatkowo z C. - rafcio100 2020-03-27 13:19
I bardzo dobrze robisz, i to Ci się chwali. Brak wyczucia tonu nam proszę wybacz, powszechny autyzm u programistów to nie jest jednak mit, niestety… Ty robisz wszystko OK, zawaliła firma. I możesz chcieć z kimś w niej o tym porozmawiać (a możesz nie chcieć, zależy jak dobre stosunki masz ze współpracownikami i szefostwem). - Althorion 2020-03-27 13:19

Pozostało 580 znaków

2020-03-27 12:58

Rejestracja: 12 lat temu

Ostatnio: 4 minuty temu

2

IMO burza w szklace wody.
Literały nie powinny znaleźć się bezpośrednio w kodzie, bo to jest zła praktyka zwana "Liczby magiczne".
Lekarstwem jest definiowanie stałych, które mają dobrze określony typ i nadanie im wartości za pomocą literału nie wymaga użycia suffix'ów oznaczających typ.

Wyjątkiem od liczb magicznych są wartości nie niosące ze sobą kontekstu np 0 1 2 (przykład: double s = a*t*t/2 + x0; - nikt normalny nie zastąpi 2 stałą).

Jedyny sens kiedy widzę sens używania suffix'ów do literałów:

  • użycie szablonów, gdzie trzeba narzucić konkretny typ, np auto a = std::min(0ll, x)
  • sufixy użytkownika (c++11):
using namespace std::literals;

auto duratiom = 5s;

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22, 2020-03-30 12:18
Zgadzam się, tylko przykłady podałeś z C++, a to temat o C… - Althorion 2020-03-27 13:04
w takim razie jeszcze bardziej jest to burza w szklance wody. - MarekR22 2020-03-27 13:09

Pozostało 580 znaków

Odpowiedz

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