#include #include #include #include #include #define PRINT_ERRNO printf("Errno = [%d] = [%s]\n", errno, strerror((errno))); void clean_stdin(void) { int c; do { c = getchar(); } while (c != '\n' && c != EOF); } int UI_getLongHexa(char *chaine) { char str[1000] = {0}; // buffer pour l'entree clavier char * endptr = NULL; long number = 0; // Nettoyer errno errno = 0; // Saisie utilisateur if(fgets(str, 1000, stdin) == NULL) { // Erreur lecture PRINT_ERRNO clean_stdin(); return -1; } // Delete '\n' that "fgets()" puts at the end of "input" if( (endptr=strchr(str,'\n')) != NULL) { *endptr = '\0'; endptr = NULL; } //Convertion number = strtol(str, &endptr, 16); if ( (str[0]!='\0') && (*endptr=='\0') && ((number!=LONG_MAX) || ((number==LONG_MAX) && (errno!=ERANGE))) && ((number!=LONG_MIN) || ((number==LONG_MIN) && (errno!=ERANGE))) ) { strcpy(chaine, str); return 0; // nombre OK } else { PRINT_ERRNO return -2; // erreur de convertion } } unsigned long twoComplementOf(unsigned long nombre) { #warning Potentiel depassement de format ! return (~nombre+1); } int main(void) { printf("-1 = %X\n\n", -1); puts("Entrer des nombres hexadecimaux : \n\n"); char *str = malloc(1000); unsigned long number = -1; int isvalid = -1; while( number != 0 ) { printf("0x"); isvalid = UI_getLongHexa(str); if(isvalid==0) { printf("\tChaine valide obtenue = [%s]\n", str); number = strtol(str, NULL, 16); // on a deja verifie que la chaine est convertible // Traitement particulier pour les nombres negatifs if( !(str[0]>='0' && str[0]<'8') ) { // Extend MSB switch(strlen(str)) { case(1): number = 0xFFFFFFF0UL | number; break; case(2): number = 0xFFFFFF00UL | number; break; case(3): number = 0xFFFFF000UL | number; break; case(4): number = 0xFFFF0000UL | number; break; case(5): number = 0xFFF00000UL | number; break; case(6): number = 0xFF000000UL | number; break; case(7): number = 0xF0000000UL | number; break; case(8): number = 0x00000000UL | number; break; default: printf("WTF?\n"); number = 0; break; } // Convertion printf("\tNombre apres extension : %lX\n", number); number = (long)twoComplementOf((unsigned long)number) * (-1); // fonction qui travaille sur des unsigned } // Affichage du resultat printf("=%ld\n\n", number); } else { number = -1; printf("\tInvalide !\n\n"); } } puts(".......Fin"); return 666; }