Poslední příspěvky

Stran: 1 ... 8 9 [10]
91
Vývoj / Re:Je jazyk C skutočne ťažký?
« Poslední příspěvek od vrit kdy 03. 06. 2025, 11:57:56 »
Cely ten pripad s rotaci signed integeru mi prijde jako umele vykonstruovany priklad ktery jsem treba ja v praxi nikdy nemel,  nevim jak ostatni... Ale dava to smysl proc to tak je a tezko si predstavit ze by to melo byt jinak.
To je tvůj problém, že bitovým rotacím nerozumíš. Arithmetic right shift na signed čísle je jasně definovaný a je přesně dané, co to dělá a jsou na to CPU instrukce. Problém C je v tom, že přesně nedefinuje, co má rotace na signed čísle dělat. Standard dává možnost přeložit to jako aritmetický, nebo logický shift. Je to jeden z tisíce způsobů, jak se v C střelit do nohy, protože většína lidí předpokládá, že je to arimetický shift. Ale nemusí být, když to překladač C přeloží jako logický shift, je to taky podle C standardu v pořádku.

pouze u signed cisel, u unsigned je operace definovana exaktne... mozna bys mohl mene urazet a vice chapat... neni to zadny problem, protoze provadet takove operace na signed cislech je implementation defined z podstaty, protoze samotna signed aritmetika je implementation defined
92
Vývoj / Re:Je jazyk C skutočne ťažký?
« Poslední příspěvek od vrit kdy 03. 06. 2025, 11:56:48 »
Ono je zakazano pouzivat knihovny?
Aritmetiku s velkymi cisly resi gmp knihovna. Proc znovuvynalezat kolo?
https://gmplib.org/
GMP není úplně vhodné řešení, když počítám s jednoregistrovými čísly a akorát potřebuju nějak pořešit přetečení.

Tak jasne no, C jako takove nerekne jestli operace pretece nebo ne - nema pristup k Carry flagu. Rekl bych ze to je opet proto ze ne vsechny architektury resi carry flag stejne. Mozna jsou i nejake ktere ho nemaji vubec. C musi byt prenositelne, to je jeho zakladni vlastnost.
Ale moznost jak detekovat preteceni v C existuje, clovek si muze lehce napsat funkci ktera mu rekne jestli vysledek scitani pretece nebo ne. Druha moznost je to implementovat pomoci assembleru a udrzovat header pro vsechny podporovane architektury - ta moznost tu je. Ale neni toto problem ve vsech jazycich? Je nejaky jazyk ktery nativne vyuzije carry flag? Nevolaji vsechny jen nejakou funkci ktera detekuje preteceni, podobne jako treba tato funkce v C?
Kód: [Vybrat]
bool will_addition_overflow(unsigned int a, unsigned int b)
{
    return a > UINT_MAX - b;
}
93
Vývoj / Re:Je jazyk C skutočne ťažký?
« Poslední příspěvek od linuxak kdy 03. 06. 2025, 11:52:19 »
Cely ten pripad s rotaci signed integeru mi prijde jako umele vykonstruovany priklad ktery jsem treba ja v praxi nikdy nemel,  nevim jak ostatni... Ale dava to smysl proc to tak je a tezko si predstavit ze by to melo byt jinak.
To je tvůj problém, že bitovým rotacím nerozumíš. Arithmetic right shift na signed čísle je jasně definovaný a je přesně dané, co to dělá a jsou na to CPU instrukce. Problém C je v tom, že přesně nedefinuje, co má rotace na signed čísle dělat. Standard dává možnost přeložit to jako aritmetický, nebo logický shift. Je to jeden z tisíce způsobů, jak se v C střelit do nohy, protože většína lidí předpokládá, že je to arimetický shift. Ale nemusí být, když to překladač C přeloží jako logický shift, je to taky podle C standardu v pořádku.
94
Vývoj / Re:Je jazyk C skutočne ťažký?
« Poslední příspěvek od vrit kdy 03. 06. 2025, 11:45:21 »
spravne (a bez specifikace bitove sirky) takto:
Kód: [Vybrat]
~0u >> 1
O tom, jestli je to správně by se dalo diskutovat dlouho. Hlavně proto, že nemáme zadání, co má ten program vypsat. Čěkal bych, že správné chování by se pokud možno nemělo lišit mezi platformama.

tak predpokladam ze zadani je udelat bitovy shift o jedno misto doprava... toto je prave stejne chovani napric vsema platformama protoze zaprve to pouziva ~0 misto -1 (ktere se muze lisit tam kde nejsou signed cisla implementovany dvojkovym doplnkem) a zadruhe je oprace provadena na unsigned integeru (0u), cili tam je jasne definovane jaky bude vysledek.
95
Vývoj / Re:Je jazyk C skutočne ťažký?
« Poslední příspěvek od Radek Miček kdy 03. 06. 2025, 11:44:32 »
Ve standardní knihovně v stdckdint.h je ckd_add
Ejhle, novinka :) Umí to někdo jiný než clang? V godboltu jsem to jinde nerozjel. To je i __builtin_add_overflow  přenositelnější.

Ještě to umí GCC od 14.1, ale snad se přidají i další, když už je to ve standardu.
96
Vývoj / Re:Je jazyk C skutočne ťažký?
« Poslední příspěvek od vrit kdy 03. 06. 2025, 11:42:21 »
C zachovava pri rotaci znamenko protoze rotace je provadena na znamenkovem typu, dela tedy tzv. aritmeticky bit shift.
Ani náhodou. Right shift na signed integeru je v C implementation defined. Překladač to může přeložit jako arimetický, nebo jako logický shift. Výsledek bude samozřejmě úplně jiný. Ke zbytku toho, co jsi napsal, se nebudu vyjadřovat, je to stejně nesprávné jako tvoje tvrzení, že je to aritmetický bit shift.

Nerekl jsem ze to neni implementation defined. Naopak to zakonite musi byt implementation defined, protoze reprezentace signed cisel neni nijak specifikovana a samotna je implementation defined. Muze byt pres dvojkovy doplnek (jak uz jsem psal v tom zbytku co jsi necetl) a muze byt i jinak.

Proto nema smysl vubec ani neco takoveho psat - rotaci na signed cisle. Ja jsem vzdy delal veskere bitove operace na unsigned typech a nikdy jsem s tim nemel problem. Kdo se chce strelit do nohy, toho C samozrejme necha, protoze neobsahuje zadne vozeni za rucicku. Z tohoto pohledu je tedy C tezky jazyk - clovek musi presne vedet jak to dole funguje.

Cely ten pripad s rotaci signed integeru mi prijde jako umele vykonstruovany priklad ktery jsem treba ja v praxi nikdy nemel,  nevim jak ostatni... Ale dava to smysl proc to tak je a tezko si predstavit ze by to melo byt jinak.
97
Vývoj / Re:Je jazyk C skutočne ťažký?
« Poslední příspěvek od Jiří Havel kdy 03. 06. 2025, 11:36:05 »
Ono je zakazano pouzivat knihovny?
Aritmetiku s velkymi cisly resi gmp knihovna. Proc znovuvynalezat kolo?
https://gmplib.org/
GMP není úplně vhodné řešení, když počítám s jednoregistrovými čísly a akorát potřebuju nějak pořešit přetečení.
98
Vývoj / Re:Je jazyk C skutočne ťažký?
« Poslední příspěvek od Jiří Havel kdy 03. 06. 2025, 11:34:30 »
spravne (a bez specifikace bitove sirky) takto:
Kód: [Vybrat]
~0u >> 1
O tom, jestli je to správně by se dalo diskutovat dlouho. Hlavně proto, že nemáme zadání, co má ten program vypsat. Čěkal bych, že správné chování by se pokud možno nemělo lišit mezi platformama.
99
Vývoj / Re:Je jazyk C skutočne ťažký?
« Poslední příspěvek od Jiří Havel kdy 03. 06. 2025, 11:23:53 »
Tak treba lidi co delaji linux v C pisou.

Ja v C taky pisu a je to muj nejoblibenejsi jazyk.
Linux není psaný v C ale v GCC dialektu. Portování do clangu se provedlo tak, že do clangu přidali nezbytnou část gcc dialektu ;)

Ve standardní knihovně v stdckdint.h je ckd_add
Ejhle, novinka :) Umí to někdo jiný než clang? V godboltu jsem to jinde nerozjel. To je i __builtin_add_overflow  přenositelnější.
100
Vývoj / Re:Je jazyk C skutočne ťažký?
« Poslední příspěvek od Radek Miček kdy 03. 06. 2025, 11:08:57 »
Ahoj, moja otázka je veľmi jednoduchá. Je jazyk C skutočne ťažký alebo to je iba môj osobný dojem?

- Dostaneš nulovou podporu pro to, abys to zajistil. Jazyk C je high level assembler, ve kterém není add with carry. Schválně si to zkuste ve standardním C napsat. Ano, asi tak všechny překladače pro to mají nějakou intrinsiku, páč se bez toho funguje fakt blbě.

Ve standardní knihovně v stdckdint.h je ckd_add
Stran: 1 ... 8 9 [10]