2015-05-30 10 views
5
unsigned int value = 1860; 
int data = 1300; 
if((data - value) > 0) 
{ 
    printf("Why it is printing this"); 
} 

wyjściowa: Dlaczego jest wydrukowanie tegoOdejmij Signed całkowitą liczba całkowita bez znaku

ja nie rozumiejąc, dlaczego odejmowanie podpisanego formularza unsigned przechodzą przez „jeśli”, chociaż wartość zmiennej „dane” jest mniejsza niż zmienna "wartość". Jestem bardzo ciekawy, jak podpisane i niepodpisane odjęcie "mały błąd", ale prowadzi do dużego, ponieważ używałem funkcji "Opóźnienie" zamiast "printf", a moje zadanie było opóźnione, co powodowało chaos.

unsigned int value = 1860; 
int data = 1300; 
if((data - value) > 0) 
{ 
    Delay(data - value); 
} 

Ta część jest ciągle opóźnia i moim zadaniem nie ends.That oznacza wartość „data” - wartość jest ujemna, dlatego idzie na nieskończonej oczekiwania. Jednocześnie przechodzi przez "jeśli", gdzie warunkiem jest "wartość-danych"> 0. Moja wątpliwość, jeśli podpis zostanie przekształcona w niepodpisane i przechodzi przez "jeśli", to dlaczego daje wartość ujemną do funkcji "Opóźnienie".

+0

Wartość "wartości danych" nie jest ujemna, jest przeciwnie, to znaczy zbyt duża. Spróbuj tego: 'printf ("% u ", wartość danych);' – skrtbhtngr

Odpowiedz

7

int typ danych jest domyślnie signed w C/C++, tj. Obsługuje liczby ujemne. Gdy wyrażenie zawiera zarówno wartości signed i unsignedint, zostanie automatycznie przekonwertowane na na unsigned int, więc wynik nie będzie mniejszy niż 0. Co możesz zrobić to w ten sposób:

unsigned int value = 1860; 
int data = 1300; 
if((signed)(data - value) > 0) 
{ 
    printf("Why it is printing this"); 
} 

To wyraźnie konwertuje wynik ekspresji do wartości signed tak, że może być liczbą ujemną.

Powiązane problemy