Quel est le comportement de la division entière?
Par exemple,
int result;
result = 125/100;
ou
result = 43/100;
Résultat sera toujours le sol de la division? Quel est le comportement défini?
- Résumé: nombre entier signé de la division de la tronque vers zéro. Pour les non-résultats négatifs, c'est le même que le plancher (arrondi vers -l'Infini). (Attention, C89 ne garantit pas que cette, de voir les réponses.)
- Tout le monde n'arrête pas de dire "tronquer vers zéro" ou "plafond" ou "sol" comme le code est prise d'une décision délibérée sur la technique à utiliser. Si le code pouvait parler il dirait
"I just throw the dam fraction part in the trash and move on with life"
- Le "code" est prise d'une décision délibérée. Conformément à la spécification, la division entière est destinée à être T(runcation)-division. De ce fait, le modulo/reste de l'opérateur est mis en oeuvre différemment que s'il avait été dans une autre langue, dire, Python ou Ruby. Voir ceci pour une liste de façons différentes langues ne l'opérateur modulo et ceci qui donne la liste d'au moins cinq des moyens communs des langages de programmation décide de faire div/modulo.
- Je parle familièrement par les commentaires qu'il a été transformer en un "c'est tronquer vers zéro... non c'est à l'étage... pas si négatives de son plafond..." parfois, les aspects techniques ne se propagent pas dans le futur avec de la mémoire humaine comme nous le voulons, mais de savoir intuitivement que la "fraction est jeté", vous pouvez tirer les points techniques. Détails techniques sont un lourd fardeau, mais l'intuition est léger et rafraîchissant comme le vent, je vais effectuer ces loin et large, et lorsque c'est nécessaire, je vais le savoir par où commencer. Comme ce document est lié, je vous remercie.
- J'ai répondu ici avec l'accent sur la division Euclidienne (inter-play entre la division entière et le module de l'opérateur).
- Liés: faire la division entière avec arrondi à l'entier le plus proche entier, au lieu de les tronquer: stackoverflow.com/questions/2422712/...
Vous devez vous connecter pour publier un commentaire.
Oui, quotient entier de deux opérandes.
et la note de bas de page:
De cours de deux points à noter sont les suivants:
et:
[Note: c'est moi qui souligne]
(a / b) * b + a % b == a
a dû être satisfait, et la valeur absolue dea % b
devait être à moins dea
, mais sia % b
a été négatif pour la négativea
oub
n'a pas été spécifié."I just throw the dam fraction part in the trash and move on with life"
Dirkgently donne une excellente description de la division entière en C99, mais vous devez également savoir que C89 division entière avec un négatif opérande a une mise en œuvre définies par la direction.
De l'ANSI C projet (3.3.5):
Donc attention avec les nombres négatifs lorsque vous êtes coincé avec un C89 compilateur.
C'est un fait amusant que C99 a choisi de troncature vers zéro, car c'était comment FORTRAN fait. Voir ce message sur comp.std.c.
reliable integer division
comme une nouvelle fonctionnalité du langage. Incroyable*-*
.expr1 / expr2
etexpr1 % expr2
doivent être compatibles les uns avec les autres lorsque les deux instances deexpr1
de combiner les mêmes objets de la même façon, et de même pour laexpr2
, mais le choix de tronquer contre parqueté division est contraire Spécifiée. Ce qui aurait permis plus efficace de génération de code sans casser beaucoup de compatibilité (et la mise en œuvre pourrait comportement spécifique si incliné)Où le résultat est négatif, C tronque vers 0 plutôt que de plancher - j'ai appris cela de la lecture sur pourquoi Python division entière toujours étages ici: Pourquoi Python Division entière Étages
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
, réitéré avec l'évolution des valeurs devalue
. Il fait un joli entier approximation de premier ordre filtre passe-bas à constante de tempsk
... mais c'est seulement symétrique, si la division est troncature etcarry
obtient des valeurs négatives. Les deux comportements de division utile de temps à autre.div
est un parqueté opérateur de division etfactor
est impair, alorsfiltered += (filter+(factor div 2)) div factor
donnerait propre et symétrique de comportement pour toutes les valeurs àINT_MAX-(factor div 2)
.filtered
carry
, etfactor
, il y aura "facteur" valeurs de rendement pour chaque valeur de sortie est strictement comprise entre le minimum et le maximum possible de sorties, sauf qu'il n'y aura2*factor+1
valeurs qui donnent une valeur de sortie de zéro.Oui, le résultat est toujours tronquée vers zéro. Il sera tour vers la plus petite valeur absolue.
Pour non signé et non négatif signé valeurs, c'est le même que le plancher (arrondi vers -l'Infini).
Pas. Le résultat varie, mais la variation se produit uniquement pour les valeurs négatives.
De préciser étage des tours vers l'infini négatif,tout entier de la division de tours vers zéro (tronque)
Pour les valeurs positives qu'ils sont de la même
Pour une valeur négative, ce qui est différent