2014-09-21 23 views
3

Ниже приводится выдержка из книги С Майка Банахана & Brady (Link: Section 2.8.2.1). У плебса, подобного мне, нет причин сомневаться в том, что автор ошибается, если вы не предложите иное.Как выражение "(a/b) * b + a% b - a" всегда равно нулю в C для ненулевого 'b'?

Пожалуйста, расскажите мне, как на земле "(a/b) * b + a% b - a" всегда равно нулю для целых чисел, где b не равно нулю.

извлеченный текст следующим образом:

Если один из операндов отрицателен, то результат/может быть ближайший целое к истинному результата с обеих сторон, и знак результата в% может быть положительным или отрицательный. Обе эти функции определены .

Это всегда верно, что следующее выражение равно нулю:

(a/b)*b + a%b - a 

, если б не равна нулю.

Обычные арифметические преобразования применяются к обоим операндам.

+0

как примечание, оно было от реализации в C89. Поскольку C99, деление определяется как округление к 0 (и данное уравнение все еще выполняется). – mafso

ответ

4

Это верно по определению оператора % в С.

Определение оператора остатка в C Стандарт говорит:

(С11, 6.5.5p6) «Если фактор a/b является представимым, выражение (a/b) * b + a% b должно быть равно a;

отметить также, что для обоих / и %, если второй операнд является 0 Стандарт определяет операцию, чтобы быть неопределенное поведение.

+0

Хммнн .... отвечает на это .... все мясо..Я пытаюсь пережевать ... это займет некоторое время, чтобы переварить .. +1. – Thokchom

+2

Я никогда не ожидал, что этот пример может быть стандартным: O – haccks

+0

@haccks Подождите минуту ... я просто случайно упомянул выражение из стандарта в моем вопросе? :-) – Thokchom

4

Математически ...

На бумаге (а/б) * б == а (б отменяет) поэтому результат выглядит смешно.

Однако компьютер сначала вычисляет (a/b), а затем умножается на b. Если это делается в целочисленной арифметике, то a/b потенциально округляется до умножения.

< Если б, то результат а/Ь равен 0, а% Ь является, давая 0 + а - == 0

если а> Ь, то (а/б) * б == этаж (а/б) и (а/б) * б + а% Ь == а, снова дает 0.

по существу это тест ли компилятор правильно целочисленной арифметики

+1

+1. Да, математическое объяснение проливает больше света на него. – Thokchom

+0

Иногда возникает проблема с 'a == INT_MIN' и' b == -1'. – chux

2

Если num1/пит2 дает фактор д и остаток г,
затем num1 = q*num2 + r

Здесь num1 как a и num2 как b, затем a/b - частная часть, а остальная часть - a%b.

Так a=(a/b)*b+(a%b) и (а/б) * B + (а% б) -a равно

Смежные вопросы