cristidm Posted December 27, 2013 Report Posted December 27, 2013 (edited) Salut, de ceva vreme m-am apucat sa rezolv exercitii din k&r si cred mi-as folosi mult mai util timpul daca mi-ar mai da si alti cate un sfat pe codul scris de mine, asa mai invat din greseli. Va rog, daca nu va dereanjeaza, sa-mi spuneti ce credeti despre rezolvarea mea.Crerinta:IN A TWO'S COMPLEMENT NUMBER REPRESENTATION, OUR VERSION OF itoa DOES NOT HANDLE THE LARGEST NEGATIVE NUMBER, THAT IS, THE VALUE OF n EQUAL TO -(2^(wordsize-1)). EXPLAIN WHY NOT. MODIFY IT TO PRINT THAT VALUE CORRECTLY, REGARDLESS OF THE MACHINE ON WHICH IT RUNS. Rezolvare:Ideaa este in felul urmator, valoarea absoluta a celui mai mic numar in 2-s complement va fi intodeauna mai mare decat cea mai mare. Ceva de genul |min|> max sau |min| - 1 == max. Snippetul original postat de autor in carte converteste variabila n in numar pozitiv daca vede ca aceasta este negativa. Eu am ales sa o las negativa si sa convertesc rezultatul operatiei modulo.In versiunea mea, exercitiul se gaseste la pagina 78.#include <stdio.h>#include <string.h>#include <limits.h>void itoa(int n, char s[]);void reverse(char s[]);int main() { char s[230]; itoa(INT_MIN, s); printf("%s", s); return 0;}void itoa(int n, char s[]) { int sign, i; sign = (n < 0) ? -1 : 1; i = 0; do{ s[i++] = (n % 10) * sign + '0'; } while((n /= 10) != 0); if(sign < 1) { s[i++] = '-'; } s[i] = '\0'; reverse(s);}void reverse(char s[]) { int i, j; int temp; for(i = 0, j = strlen(s) - 1; i < j; i++, j--) { temp = s[i]; s[i] = s[j]; s[j] = temp; }} Edited December 27, 2013 by cristidm Quote