예를 들어
int result;
result = 125/100;
또는
result = 43/100;
결과는 항상 부서의 바닥입니까? 정의 된 동작은 무엇입니까?
"I just throw the dam fraction part in the trash and move on with life"
예를 들어
int result;
result = 125/100;
또는
result = 43/100;
결과는 항상 부서의 바닥입니까? 정의 된 동작은 무엇입니까?
"I just throw the dam fraction part in the trash and move on with life"
답변:
결과는 항상 부서의 바닥입니까? 정의 된 동작은 무엇입니까?
예, 두 피연산자의 정수 몫입니다.
6.5.5 곱하기 연산자
6 정수를 나누면 / 연산자의 결과는 분수 부분을 버린 대수 몫입니다. 88) 몫 a / b가 표현 가능하면, 식 (a / b) * b + a % b는 a와 같아야한다.
그리고 해당 주석 :
88) 이것을``0으로 자르기 ''라고합니다.
물론 주목해야 할 두 가지 사항은 다음과 같습니다.
3 일반적인 산술 변환은 피연산자에서 수행됩니다.
과:
5 / 연산자의 결과는 첫 번째 피연산자를 두 번째 피연산자로 나눈 몫입니다. % 연산자의 결과는 나머지입니다. 두 연산에서 두 번째 피연산자의 값이 0이면 동작이 정의되지 않습니다.
[참고 : 강조 광산]
(a / b) * b + a % b == a
만족되는 한, 그리고 절대 값 a % b
있었다 미만 수 a
있지만 여부 a % b
네거티브 부정적 a
또는 b
지정되지 않았다.
Dirkgently는 C99의 정수 나눗셈에 대한 훌륭한 설명 을 제공 하지만 C89에서는 음의 피연산자가있는 정수 나눗셈에 구현 정의 방향이 있음을 알아야합니다.
ANSI C 초안 (3.3.5)에서 :
피연산자가 음수 인 경우, / 연산자의 결과가 대수 지수보다 작은 최대 정수인지 또는 대수 지수보다 큰 최소 정수인지 여부는 % 연산자 결과의 부호와 같이 구현 정의됩니다. 몫 a / b가 표현 가능한 경우, 표현 (a / b) * b + a % b는 a와 같아야합니다.
따라서 C89 컴파일러가 붙어있을 때 음수로 조심하십시오.
FOR99가 그렇게했기 때문에 C99가 0으로 잘림을 선택했다는 것은 재미있는 사실입니다. comp.std.c 에서이 메시지 를 참조하십시오.
reliable integer division
새로운 언어 기능으로 언급 됩니다. 놀랍습니다 *-*
.
expr1 / expr2
와 expr1 % expr2
의 두 인스턴스 때 서로 일치해야합니다 expr1
마찬가지로에 대해 동일한 방법으로 동일한 개체를 결합하고 expr2
있지만, 바닥의 부문에 비해 절단의 선택은 달리 지정되지 않은 것입니다. 즉 많은 호환성을 깨지 않고 더 효율적인 코드 생성을 허용 한 것 (경 사진 경우 구현 고유의 동작을 문서화 수)
결과가 음수이면 C가 바닥이 아닌 0으로 잘립니다. 파이썬 정수 나누기가 왜 항상 여기에 있는지에 대한이 독서를 배웠습니다. 왜 파이썬의 정수 나누기 마루
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
값을 변경하면서 반복했습니다 value
. 시간 상수가있는 1 차 저역 통과 필터에 대한 근사한 근사치를 만듭니다 k
...하지만 나누기가 잘리고 carry
음수 값을 얻는 경우에만 대칭 입니다. 나눗셈에 대한 두 가지 행동은 때때로 편리합니다.
div
바닥의 나눗셈 연산자이고 factor
홀수, 그때 filtered += (filter+(factor div 2)) div factor
까지의 모든 값이 깨끗한 대칭 동작을 얻을 것이다 INT_MAX-(factor div 2)
.
결과는 항상 부서의 바닥입니까?
아니요. 결과는 다양하지만 변동은 음수 값에 대해서만 발생합니다.
정의 된 동작은 무엇입니까?
정수 나누기가 0으로 반올림되는 동안 바닥이 음의 무한대로 명확하게 반올림되도록합니다 (잘라 내기)
양수 값은 동일합니다.
int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0
음수의 경우이 값이 다릅니다
int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0