Portál AbcLinuxu, 12. května 2025 09:00
Do not shift an expression by a negative number of bits or by a number greater than or equal to the precision of the promoted left operand.Já právě nevím, jestli tohle chápu dobře. Mně se zdá, že mluví už o tom povýšeném operandu (tedy v mém případě by to už byl int, na který bude uint_least16_t povýšen, na jiné platrmě, kde int je 16bit povýšen nebude, to je taky problém). Jak nejlépe vyřešit tuto situaci, aby nedocházelo k UB?
#include "limit.h"
if (sizeof(a)*CHAR_BIT>16)
{
a=a<<16;
}else
{
a=0;
}
B)nebo podmíněným překladem, trošku čistější z hlediska generovaného kódu ale někomu se podmíněný překlad nelíbí.
#include "stdint.h"
#ifdef UINT_LEAST16_MAX > 65535
a=a<<16;
#else
a=0;
#endif
p.s. include nema mit uvozovky ale znamenko vetsi mensi ale nejak mi to zdejsi forum nechce pustit
p.s. include nema mit uvozovky ale znamenko vetsi mensi ale nejak mi to zdejsi forum nechce pustit
Je potřeba je zapsat entitami <
resp. >
(což udělají tlačítka "<
" a ">
" nad formulářem).
uint_least16_t x;
x <<= 8U;
x <<= 8U;
Optimalizují překladač by to mohl přeložit i docela rozumně. Např. gcc při O2 nahradí posuny XORem registru pro uint16_t a shiftem o 16 pro uint32_t.
int a;
short i; //minimalne 16b
a = i << 16; // může delat chybu, pokud bude short 16b
a = ((int) i) << 16; // je v poradku
Kdyby radsi ucil lepsi jazyky kde tyto problemy neexistuji :D
Tak to je nekde neco spatne stejny kod v C a v D by mel byt vetsinou skoro uplne stejne vykony. Snad nikdy jsme nedosahl nijak horsiho vykonu. Samozrejme je potreba srovnavat GDC a GCC, pripadne clang ldc nebo dmc a dmd.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.