[RISOLTO] [C] Assegnamento unsigned a variabile signed

di Anonimizzato25660 il
7 risposte
EDIT: Problema risolto. 11/02/2019

Questo programma serve per poter ricavare il range di valori contenuti all'interno di una variabile di un determinato tipo, senza fare riferimento alla libreria limits.h :
#include <stdio.h>

void printDim(short nBytes, int Signed);

int main()
{
	printf("Signed Char dim:\n");
	printDim(1,1);
	printf("Signed Short dim:\n");
	printDim(2,1);
	printf("Signed Long dim:\n");
	printDim(4,1);
	printf("Unsigned Char dim:\n");
	printDim(1,0);
	printf("Unsigned Short dim:\n");
	printDim(2,0);
	printf("Unsigned Long dim:\n");
	printDim(4,0);
	return 0;
}

void printDim(short nBytes, int Signed)
{
	nBytes *= 8; //Trasformo i bytes in bits
	unsigned long max = 1;

	for(int i = 0;i < nBytes;i++)
	{
		if((i + 1) == nBytes)   //Se si tratta dell'ultimo bit
			max = ((max - 1) * 2) +1;   //Per evitare che l'ultimo valore superi la dimensione del suo contenitore mi assicuro che arrivi precisamente all'ultimo numero che può contenere un unsigned long.
		else
			max *= 2;
	}
  
	signed long minVal = ( Signed == 1 ) ? -((max/2)+1) : 0;
	unsigned long maxVal = ( Signed == 1 ) ? max/2 : max;
  
	printf("FROM %10lu\n  TO %10lu\n\n",minVal,maxVal);
}
OUTPUT:


Sto cercando una soluzione a questo problema, non saprei come effettuare correttamente la conversione da unsigned a signed in questa espressione. So che una possibile soluzione per quello che devo fare è inserire il meno direttamente sotto forma di testo nel printf e poi inserire come parametro il resto dell'espressione ma volevo riuscire a inserirlo all'interno di una variabile questo valore. Grazie in anticipo per le risposte!

PS: Mi sono appena iscritto e ho letto il regolamento... ho già scritto questo post anche su un altro forum, ma ahimè dopo giorni non ho ricevuto risposta e spero di trovare qui una community più attiva in cui rimanere, non me ne vogliate :<

7 Risposte

  • On so se ho capito il tuo (strano) problema ma dovresti usare due printf diverse in base a Signed
  • oregon ha scritto:


    On so se ho capito il tuo (strano) problema ma dovresti usare due printf diverse in base a Signed
    Non credo, perché dovrei? Crea conflitto utilizzare diversi tipi nella stesso printf?
    In ogni caso credo di aver risolto: all'interno del printf dovrei sostituire %10lu con %10d, in quanto specificato che si trattasse di un unsigned. Errore di distrazione

    Riga corretta:
    printf("FROM %10d\n  TO %10lu\n\n",minVal,maxVal);
  • Se vuoi visualizzare un unsigned usi lu altrimenti per un valore con segno usi d

    Il suggerimento era di usare due printf corretti per il tipo di dato corrispondente

    Ma se tu 'non credi' va bene così
  • Devo aver frainteso allora ^^" Scusa ma per printf io intendo la funzione, gli altri uso chiamarli parametri, sono nuovo del linguaggio e non so se in gergo scrivete diversamente..
  • Anche io intendo la funzione, non c'entrano i parametri. Comunque, va bene così, chiudiamo la questione.
  • Appunto, quindi se ho capito bene intendevi inserire due funzioni printf, una per ciascuna variabile, giusto?
  • Sì, qualcosa del genere, ma non importa
    
    if(Signed)
      printf("FROM %10d\n  TO %10d\n\n",minVal,maxVal);
    else
      printf("FROM %10lu\n  TO %10lu\n\n",minVal,maxVal);
    
Devi accedere o registrarti per scrivere nel forum
7 risposte