PROBLEMA Logica di programmazione

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Fermo restando che l'ho risolto, voglio vedere il vostro approccio.

Una funzione chiamata MOLTIPLICA di tipo void accetta come parametro solo 1 intero negativo, l'intero viene moltiplicato per -1, e infine viene stampato il risultato tramite una printf. Se il risultato è positivo il programma crasha se è negativo continua.

E' possibile ottenere un risultato negativo senza modificare il codice? Stilare il codice di esempio.
 

dona311

Utente Èlite
3,894
555
CPU
Celeron Tualatin 1100A @1.46 ghz 1.75v
Scheda Madre
ECS p6vxat+
HDD
Seagate ide 20gb
RAM
Infineon 2x256mb PC133 cl2
GPU
Gainward geforce 3 ti 200 GS 128mb @gf3ti500
Audio
Sound Blaster Live!
PSU
FSP 235w
Case
Generico
OS
Windows 2000
Ci provo :look: Sono un elettronico, ho studiato programmazione ma non ad altissimi livelli. Magari imparo qualcosa di nuovo!
Non ho capito se è possibile modificare il parametro passato alla funzione. In caso affermativo,
io rappresenterei l'argomento passato alla funzione in complemento a 2, che preso come intero negativo risulterebbe quindi positivo, una volta moltiplicato per -1 il risultato sarebbe negativo.

Esempio(argomento di MOLTIPLICA come intero signed a 8bit):
MOLTIPLICA(-233);
233 è il ca2 di 23, il compilatore/cpu prenderà 233 e rieseguirà il ca2 su di esso ottenendo 23,.numero positivo.
 
Ultima modifica:

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Ci provo :look: Sono un elettronico, ho studiato programmazione ma non ad altissimi livelli. Magari imparo qualcosa di nuovo!
Non ho capito se è possibile modificare il parametro passato alla funzione. In caso affermativo,
o rappresenterei l'argomento passato alla funzione in complemento a 2, che preso come intero negativo risulterebbe quindi positivo, una volta moltiplicato per -1 il risultato sarebbe negativo.

Esempio(argomento di MOLTIPLICA come intero signed a 8bit):
MOLTIPLICA(-233);
233 è il ca2 di 23, il compilatore/cpu prenderà 233 e rieseguirà il ca2 su di esso ottenendo 23,.numero positivo.
Non puoi modificare il codice, in unsigned.
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Io non ho capito la domanda :boh:
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
In che senso senza modificare il codice?
Cioè che tu hai questo programma già compilato che accetta come parametro un intero negativo e questo viene moltiplicato per -1 se il risultato è positivo crasha altrimenti il programma va avanti.
 
Ultima modifica:

dona311

Utente Èlite
3,894
555
CPU
Celeron Tualatin 1100A @1.46 ghz 1.75v
Scheda Madre
ECS p6vxat+
HDD
Seagate ide 20gb
RAM
Infineon 2x256mb PC133 cl2
GPU
Gainward geforce 3 ti 200 GS 128mb @gf3ti500
Audio
Sound Blaster Live!
PSU
FSP 235w
Case
Generico
OS
Windows 2000
Scusami ma non ho ben capito pure io, forse prima mi sono spiegato male, non intendevo di modificare il codice, ma di lavorare solo sul valore passato alla funzione.
Quello che intendo è una cosa del tipo:
di-RLDD.png
dove 4294967262, su variabile int signed a 32bit, è il complemento a 2 di 34.Risulta -4294967262*-1=-34

EDIT:Niente, c'è un problema nel mio esempio. Se il numero inserito viene controllato esso risulta comunque positivo, a meno che il controllo non venga fatto solo sulla presenza o assenza del carattere '-' . Per cui direi di non aver risolto.
Senza modificare il codice non saprei nemmeno da dove cominciare, per cui passo la palla. Però sono curioso di vedere la soluzione :D
 
Ultima modifica:

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Scusami ma non ho ben capito pure io, forse prima mi sono spiegato male, non intendevo di modificare il codice, ma di lavorare solo sul valore passato alla funzione.
Quello che intendo è una cosa del tipo:
di-RLDD.png
dove 4294967262, su variabile int signed a 32bit, è il complemento a 2 di 34.Risulta -4294967262*-1=-34

EDIT:Niente, c'è un problema nel mio esempio. Se il numero inserito viene controllato esso risulta comunque positivo, a meno che il controllo non venga fatto solo sulla presenza o assenza del carattere '-' . Per cui direi di non aver risolto.
Senza modificare il codice non saprei nemmeno da dove cominciare, per cui passo la palla. Però sono curioso di vedere la soluzione :D
Esatto, non stai passando un intero negativo ma sempre un intero positivo cambia solo la maniera in cui lo scrivi. Perciò tecnicamente è sbagliato perchè quando verrà fatto il controllo risulterà positivo.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,948
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
mica si capisce quando crasha: la prima volta hai detto che crasha se il risultato è positivo, la seconda volta se il risultato è pari...
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
mica si capisce quando crasha: la prima volta hai detto che crasha se il risultato è positivo, la seconda volta se il risultato è pari...
Ho sbagliato a scrivere, volevo scrivere positivo anche perchè non ha senso il pari.
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,948
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
ok
metto spoiler con la risposta...
allora a naso bisogna passare come parametro l'intero "più negativo" dell'intervallo permesso
per esempio, con 32 bit si deve passare -2^31= -2 147 483 648 (il massimo positivo è +2 147 483 647)
in binario in complemento a 2 equivale a 1000....000 (1 seguito da 31 zeri)
moltiplicare per -1 fa uscire dal range dei positivi rappresentabili a 32 bit (ci vorrebbero 33 bit) e con la rappresentazione in complemento a 2 il bit in più viene scartato e si riottiene di nuovo -2^31 (vale sia per y = x*(-1) che per y= -x dove x= -2^31)
in altri termini se, per esempio, in C scrivi
Codice:
int x = INT_MIN; // serve #include <limits.h>
printf("x = %d\n", x);
int y = x*(-1); // oppure y=-x;
printf("y = %d\n", y);
se lo metti in un ciclo con un controllo sul valore di y (o di x se preferisci fare x=x*(-1) ) hai un ciclo infinito perché il risultato è sempre INT_MIN
Ho indovinato?
 
Ultima modifica:
  • Mi piace
Reazioni: Mursey e Hobet

dona311

Utente Èlite
3,894
555
CPU
Celeron Tualatin 1100A @1.46 ghz 1.75v
Scheda Madre
ECS p6vxat+
HDD
Seagate ide 20gb
RAM
Infineon 2x256mb PC133 cl2
GPU
Gainward geforce 3 ti 200 GS 128mb @gf3ti500
Audio
Sound Blaster Live!
PSU
FSP 235w
Case
Generico
OS
Windows 2000
È presente la soluzione...
[/QUOTE]
ok
allora a naso bisogna passare come parametro l'intero "più negativo" dell'intervallo permesso
per esempio, con 32 bit si deve passare -2^31= -2 147 483 648 (il massimo positivo è +2 147 483 647)
in binario in complemento a 2 equivale a 1000....000 (1 seguito da 31 zeri)
moltiplicare per -1 fa uscire dal range dei positivi rappresentabili a 32 bit (ci vorrebbero 33 bit) e con la rappresentazione in complemento a 2 il bit in più viene scartato e si riottiene di nuovo -2^31 (vale sia per y = x*(-1) che per y= -x dove x= -2^31)
in altri termini se, per esempio, in C scrivi
Codice:
int x = INT_MIN; // serve #include <limits.h>
printf("x = %d\n", x);
int y = x*(-1); // oppure y=-x;
printf("y = %d\n", y);
se lo metti in un ciclo con un controllo sul valore di y (o di x se preferisci fare x=x*(-1) ) hai un ciclo infinito perché il risultato è sempre INT_MIN
Ho indovinato?

Grande!
Non ci avevo proprio pensato ai limiti di rappresentazione degli interi a 32bit, ora torna anche a me. Mannaggia a teoria dei calcolatori :cav:
 
Ultima modifica:

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Grande!
Non ci avevo proprio pensato ai limiti di rappresentazione degli interi a 32bit, ora torna anche a me. Mannaggia a teoria dei calcolatori :cav:
:asd:
 

Hobet

Utente Attivo
609
222
CPU
i5 6600k
Dissipatore
AIO H100
Scheda Madre
ASUS z170 Deluxe
HDD
1 WD Blue 1 TB; evo 850 500gb
RAM
Vengeance 4x4
GPU
GTX 1070ti MSI
Audio
Nope
Monitor
MG278Q
Case
750D Corsair
Net
Fastweb 200/30
OS
PucyBuntu
Metti la risposta sotto spoiler cosi non rovini il gioco agli altri :ok:
 
Ultima modifica:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili