Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 14-04-2004, 17:33   #1
shodan
Senior Member
 
Iscritto dal: Sep 2001
Città: Pescara
Messaggi: 3695
C: GCC e unsigned int

Ciao a tutti ragazzi,
vorrei porvi una domanda.

In C, su una normale macchina IA32 (dal 386 in su quindi) i valori associabili a una variabile di tipo int dovrebbero andare da 2147483647 a -2147483648; le variabili di tipo unsigned int invece dovrebbero avere un range da 0 a 4294967295.
Quindi un valore tipo 2147483648 (numero positivo quindi) NON dovrebbe essere gestibile da una variabile di tipo int, mentre una di tipo unsigned int dovrebbe essere perfettamente adatta allo scopo.
Ho scritto un piccolo programmino che si prefigge di testare questo. Ecco il codice:

#include <stdio.h>
#include <limits.h>

int main ()
{
unsigned int a, b;
a = 2147483647;
b = 2147483648;

printf ("%s%d", "Valore a: ", a);
printf ("%s%d", "Valore b: ", b);

return 0;
}

In linea teorica dovrebbe essere tutto OK, però con il comando "gcc x.c -Wall" ottengo il seguente output:
"x.c: In function `main':
x.c:8: warning: this decimal constant is unsigned only in ISO C90"

Ho provato anche a cambiare il codice del programma in questo modo:

#include <stdio.h>
#include <limits.h>

int main ()
{
unsigned int a, b;
a = 2147483647;
b = 2147483647+1;

printf ("%s%d", "Valore a: ", a);
printf ("%s%d", "Valore b: ", b);

return 0;
}

Questa volta, compilando il codice ottengo:
"x.c: In function `main':
x.c:8: warning: integer overflow in expression"

Ho cercato un po' su Google ma in effetti non ho le idee molto chiare sulla causa di questo... sembrerebbe che il mio compilatore (GCC 3.3.3) si rifiuti di riconoscere unsigned le variabili int 'a' e 'b'.

Qualcuno mi può chiarire le idee?

Grazie mille!

Ultima modifica di shodan : 14-04-2004 alle 17:45.
shodan è offline   Rispondi citando il messaggio o parte di esso
Old 14-04-2004, 19:02   #2
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
prova a compilare con queste flag : -std=c99 -ffreestanding -Wstrict-prototypes -O2
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 14-04-2004, 21:42   #3
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16215
Re: C: GCC e unsigned int

Quote:
Originariamente inviato da shodan
printf ("%s%d", "Valore a: ", a);
Per visualizzare gli unsigned int con printf, devi usare %u al posto di %d.

Quote:
b = 2147483648;
A priori, una costante scritta come il membro destro di questa assegnazione è una costante int.
Per renderla unsigned int, dovresti scrivere 2147483648U (o 2147483648u) al posto di 2147483648.

Quote:
b = 2147483647+1;
L'espressione a destra del simbolo di assegnazione è un'espressione di tipo int, non di tipo unsigned int.
Dato che in un'assegnazione viene valutato prima il membro destro e poi il sinistro, l'overflow si verifica eccome.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 15-04-2004, 08:45   #4
shodan
Senior Member
 
Iscritto dal: Sep 2001
Città: Pescara
Messaggi: 3695
Re: Re: C: GCC e unsigned int

Quote:
Originariamente inviato da Ziosilvio
Per visualizzare gli unsigned int con printf, devi usare %u al posto di %d.



A priori, una costante scritta come il membro destro di questa assegnazione è una costante int.
Per renderla unsigned int, dovresti scrivere 2147483648U (o 2147483648u) al posto di 2147483648.



L'espressione a destra del simbolo di assegnazione è un'espressione di tipo int, non di tipo unsigned int.
Dato che in un'assegnazione viene valutato prima il membro destro e poi il sinistro, l'overflow si verifica eccome.
Grazie mille sia a te che a Luc@s per l'aiuto. Cambiando il codice in questo modo tutto funziona bene:

#include <stdio.h>
#include <limits.h>

int main ()
{
unsigned int a, b;
a = 2147483647;
b = 2147483647+1U;

printf ("%s%d\n", "Valore a: ", a);
printf ("%s%u\n", "Valore b: ", b);

return 0;
}

In pratica (correggimi se sbaglio) se dichiaravo una variabile di tipo unsigned, assegnandoli una costante signed (senza la "U" finale) avevo quel warning dato dal compilatore che mi avvisava di questo.
In ogni caso, anche con quel warning, la compilazione va a buon fine; anche mantenendo il codice postato all'inizio ma impostando la funzione printf della variabile b come fatto in quest'ultimo post il risultato è lo stesso di quello che ottengo ora (cioè a = 2147483647 e b = 2147483648.

Quindi mi pare di capire che, warning a parte, l'errore fondamentale lo facevo nella printf...

Ciao grazie!
shodan è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Il co-inventore di ChatGPT lancia un mod...
NvpwrControl: un tool sblocca il limite ...
Samsung torna in gioco: potrebbe produrr...
Cina, boom di film girati dall'IA: 128 m...
2 portatili con 32GB di RAM in offerta s...
I nuovi Galaxy Tab S12+ e Tab S12 Ultra ...
La Cina rincorre ASML: secondo Jensen Hu...
Il Bonus Vacanze non esiste: una finta A...
Google Translate diventa offline: Live T...
Windows 11, arriva il single-finger scro...
Porsche Cayenne Electric, arrivano porte...
Apple valuta NVIDIA NVLink per un server...
Energia solare sempre più economica: dal...
Google apre Home MCP: l'IA può controlla...
Auto SR di Microsoft arriva sui Copilot+...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:29.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v