Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Unsigned only in ISO C90 ?

Ostatnio zmodyfikowano 2023-04-01 15:27
Autor Wiadomość
befejak
Temat założony przez niniejszego użytkownika
Unsigned only in ISO C90 ?
» 2023-03-31 02:13:24
Witam,
 Staram się pracować z plikami i chciałem zapisać INT-a jako 4 znaki typu char,
 zrobiłem więc 2 funkcje, jedna która konwertuje INT-a do czterech CHAR-ów i druga która to "odwraca"

Obie funkcje wyglądają tak:
C/C++
void qIntToCVal( unsigned int _Int, unsigned char * _Char ) {
   
_Char[ 3 ] =( _Int & 255 );
   
_Char[ 2 ] =( _Int & 32512 ) >> 8;
   
_Char[ 1 ] =( _Int & 8355840 ) >> 16;
   
_Char[ 0 ] =( _Int & 4286578688 ) >> 24; }

int qValToInt( unsigned char * _Char ) {
   
int a = 0;
   
a += _Char[ 0 ]; a <<= 8;
   
a += _Char[ 1 ]; a <<= 8;
   
a += _Char[ 2 ]; a <<= 8;
   
a += _Char[ 3 ]; return a; }

Obie funkcje działają poprawnie, wartości są takie same po zapisaniu do pliku i po wczytaniu z pliku.
 Ale otrzymuję jedno ostrzeżenia od kompilatora które brzmi:

warning: this decimal constant is unsigned only in ISO C90

I nie bardzo rozumiem co robię źle, błąd wskazuje na linię:
 _Char[0]=(_Int&4286578688)>>24;

Jak podmienię liczbę na wartość 0xFF000000 to kompilator już nic nie mówi o pozwala skompilować bez ostrzeżeń.
 A przecież to wciąż ta sama liczba? Początkowo miałem ją jako binarną, ale że ciąg był bardzo długi to użyłem
 Google aby przekonwertować binarną wersję na decymalną, z binarną wersją również nie było problemu.
P-180089
pekfos
» 2023-03-31 20:35:54
0xFF000000 to 4278190080, więc nie, to nie ta sama liczba. Niech to będzie nauczką żeby nie pisać takiego nieczytelnego kodu. 3 z 4 stałych w tym kodzie mają złe wartości.

Ten warning jest stąd że chcesz mieć liczbę ze znakiem, ale wartość jest za duża na long. Będzie to long long albo unsigned long zależnie od wersji języka. Ciekawe jak stary masz kompilator że w ogóle dostajesz taki warning. Powinieneś pisać 0xFF000000u żeby jawnie określić to jako liczba bez znaku.
P-180091
befejak
Temat założony przez niniejszego użytkownika
» 2023-03-31 23:00:02
W typ przypadku używałem tego starego kompilatora o którym już mówiłem.
 Zgaduję że jak 3 z 4 są błędne to tylko 255 ma prawidłową wartość?...

Może coś pomieszałem z ilością zer i jedynek ( bo jak mówiłem, wcześniej miałem te wartości zapisane binarnie )
No ale racja że będzie to dla mnie nauczka aby więcej nie pisać w taki sposób :)

Kompilator udało mi się ustalić że mam GCC 4.9,
Nie wiem jak stary jest ale był razem z CodeBlocks który pobrałem z innego forum.


Prawdę mówiąc myślałem nad tym kodem przez chwilę i doszło do mnie że wcale nie potrzebuję operatora AND
 aby "wyczyścić" wszystkie bity których nie będę używać.

Niby krótki kod a czasem można popełnić tyle błędów :), ale to przynajmniej lekcja na przyszłość.
C/C++
void qIntToCVal( unsigned int _Int, char * _Char ) {
   
_Char[ 3 ] = _Int;
   
_Char[ 2 ] = _Int >> 8;
   
_Char[ 1 ] = _Int >> 16;
   
_Char[ 0 ] = _Int >> 24; }
P-180092
pekfos
» 2023-04-01 15:27:03
Kompilator udało mi się ustalić że mam GCC 4.9,
Nie wiem jak stary jest ale był razem z CodeBlocks który pobrałem z innego forum.
GCC 4.9 to 2014-2015.
P-180093
« 1 »
  Strona 1 z 1