Jakie jest zachowanie dzielenia liczb całkowitych?

Na przykład,

int result;

result = 125/100;

Lub

result = 43/100;

Czy wynik zawsze będzie podłogą dywizji? Co to jest zdefiniowane zachowanie?

Author: Lundin, 2010-08-30

5 answers

Czy wynik zawsze będzie podłogą dywizji? Co to jest zdefiniowane zachowanie?

Tak, iloraz liczb całkowitych obu operandów.

6.5.5 operatory Multiplikatywne

6 Gdy liczby całkowite są podzielone, wynikiem operatora / jest iloraz algebraiczny z dowolnym część ułamkowa odrzucona.88) jeśli iloraz a / b jest reprezentowalny, wyrażenie (a / b) * b + A%B równa się a.

I "odpowiedni przypis": {]}

88) jest to często nazywane "okrojeniem w kierunku zera".

Oczywiście dwa punkty do odnotowania to:

3 zwykłe konwersje arytmetyczne są wykonywane na operandach.

I:

5 wynikiem działania / operatora jest iloraz z podziału na pierwszy operand po drugim; the wynik operatora % to reszta. w obu operacjach, jeśli wartość drugi operand to zero, zachowanie jest nieokreślone.

[Uwaga: moje podkreślenie]

 146
Author: dirkgently,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-30 17:32:04

Dirkgently daje doskonały opis dzielenia liczb całkowitych w C99, ale powinieneś także wiedzieć, że w C89 dzielenie liczb całkowitych z ujemnym operandem ma zdefiniowany kierunek implementacji.

Z projektu ANSI C (3.3.5):

Jeśli któryś z operandów jest ujemny, to czy wynik operatora / jest największą liczbą całkowitą mniejszą od ilorazu algebraicznego, czy najmniejszą liczbą całkowitą większą od ilorazu algebraicznego jest zdefiniowany w implementacji, tak jak znak wynik operatora%. Jeśli iloraz a / b jest reprezentowalny, wyrażenie (a/b)*B + A%B jest równe a.

Więc uważaj z liczbami ujemnymi, gdy utkniesz z kompilatorem C89.

Ciekawostką jest to, że C99 wybrał okrojenie w kierunku zera, ponieważ tak zrobił FORTRAN. Zobacz tę wiadomość {[2] } na komp.choroby weneryczne.c.

 37
Author: schot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:26

Gdzie wynik jest ujemny, C obraca się w kierunku 0, a nie podłogi - dowiedziałem się tego czytając o tym, dlaczego Python integer division always floors tutaj: Dlaczego Python Integer Division Floors

 18
Author: Gareth Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-30 17:55:17

Tak, wynik jest zawsze obcięty w kierunku zera. Będzie zaokrąglać w kierunku najmniejszej wartości bezwzględnej.

-5 / 2 = -2
 5 / 2 =  2

Dla niepodpisanych i nieujemnych wartości sygnowanych jest to to samo, co floor (zaokrąglenie w kierunku-nieskończoności).

 14
Author: Leonid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-07 04:26:50

Czy wynik zawsze będzie podłogą dywizji?

Nie. Wynik jest różny, ale zmienność występuje tylko dla wartości ujemnych.

Jakie jest zdefiniowane zachowanie?

Aby było jasne, że rundy podłogowe w kierunku ujemnej nieskończoności, podczas gdy liczba całkowita rundy w kierunku zera (okrojenia)

Dla wartości dodatnich są takie same

int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0

Dla wartości ujemnej jest to inne

int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
 10
Author: Muhammad Annaqeeb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-06 07:50:35