Dans le cas du drapeau de débordement, il semblerait que l'accès à ce drapeau serait une excellente arine à la programmation inter-architecture. Il fournirait une alternative sûre à compter sur un comportement non défini pour vérifier le débordement entier signé, tel que:
if(a > (INT_MAX - 100)) //detected overflow
3 Réponses :
Étant donné que C et C ++ sont conçus pour être indépendants de la plate-forme. Le registre de statut n'est pas.
Ces jours-ci, le complément de deux est universellement utilisé pour mettre en place des arithmétiques entier signés, mais ce n'était pas toujours le cas. Son complément ou sa signature et une valeur absolue utilisée était assez courante. Et lorsque C a été conçu pour la première fois, de tels processeurs étaient toujours en commun. Par exemple. Cobol distingue les 0 négatifs et positifs, qui existaient sur ces architectures. De toute évidence, le comportement de débordement sur ces architectures est complètement différent! P>
D'ailleurs, vous ne pouvez pas em> sur le comportement non défini pour détecter le débordement, car compilateurs raisonnables lors de la vue p> va écrire un avertissement et compiler p> ... (les optimisations fournies sont activées et l'optimisation particulière n'est pas désactivée). p> et note que vous ne pouvez pas compter sur l'avertissement. Le compilateur n'en émettra que l'avertissement lorsque la condition finit par true code> ou
false code> après des transformations équivalentes, mais il existe de nombreux cas où la maladie sera modifiée en présence de débordement sans fin sans fin en tant que nature
true code> /
false code>. p> p>
Je peux penser aux raisons suivantes. P>
En permettant l'accès aux drapeaux de registre, la transférabilité de la langue à travers les plates-formes est limitée. p> li>
L'optimiseur peut changer les expressions de manière drastique et rendre vos drapeaux inutiles. P> Li>
Cela rendrait la langue plus complexe p> li>
La plupart des compilateurs ont un grand ensemble de fonctions intrinsèques, pour faire des opérations les plus courantes (par exemple l'ajout avec le transport) sans recourir à des drapeaux. P> li>
La plupart des expressions peuvent être réécrites de manière sûre d'éviter les débordements. P> Li>
Vous pouvez toujours revenir à l'assemblage en ligne si vous avez des besoins très spécifiques p> li> ol>
L'accès aux registres de statut ne semble pas suffisamment nécessaire pour passer par un effort de normalisation. P>
Exemple de ce dernier: p> L'optimiseur peut transformer cela sur ce code de pseudo-assemblage: p> lequel À son tour, plus similaire à p> maintenant si vous interrogez des registres INBETWEEN P> puis après l'optimisation et la dissache de vous < em> pourrait em> fin avec ceci: p> qui est alors incorrect. p> Plus d'exemples pourraient être construits, comme ce qui se passe avec une constante -folding-compilé-time-débordement. P> Sidenotes: Je me souviens d'un ancien compilateur Borland C ++ ayant une petite API pour lire les registres actuels de la CPU. Cependant, l'argumentation ci-dessus sur l'optimisation s'applique toujours. P> sur un autre Sidenote: pour vérifier le débordement: p> plus concret p> ou meilleur, moins de béton: p>
C et C ++ étaient destinés à être portables. Tous les processeurs n'ont pas le même registre d'état de la CPU.
Recherche de cette question, je n'ai pas pu trouver un record d'une CPU ne pas avoir un drapeau de débordement. L'intrinsèque pourrait être décomposé dans l'accès à un drapeau individuel, ce qui lui permet d'être portable.
Les opérations SSE n'ont pas de drapeaux de débordement. Le compilateur est autorisé à mettre en œuvre des choses en utilisant des instructions SSE.
Bien que ne soit pas strictement pertinent pour la réponse à cette question, je dirais que lorsque C était initialement conçu, il n'y avait aucune instruction SSE disponible, de sorte que le problème n'a pas influencé l'omission de cette caractéristique.
Hors du sujet. Peu importe, en termes de portabilité, s'il n'y a pas ou ne sont pas des processeurs sans le drapeau. Il n'est pertinent que si elles peuvent ou ne peuvent pas être construites.
@ Timesquare: Le fait qu'il puisse y avoir des architectures sans drapeau, a probablement influencé les décisions même si l'exemple particulier de SSE ne l'a pas fait. Êtes-vous sûr que toutes les plates-formes connues au moment de la norme C ont-elles été comprises?
Au moment de la conception initiale de C, il y avait d'autres choses. Comme les CPU qui utilisaient son complément, un signe et une valeur absolue et d'autres particularités pour mettre en œuvre des arithmétiques signés. Tous ont une sémantique de débordement complètement différente.
J'ai une fois lu un article sur un comportement indéfini qui a parlé d'une machine qui avait une architecture inhabituelle pour traiter des débordements - j'aimerais pouvoir trouver cette fichue chose maintenant.
@ Timesquare "Quand C a été conçu initialement, il n'y avait aucune instruction SSE disponible" i> - exactement! Vous ne voulez pas une langue qui est uniquement portable pour le matériel d'aujourd'hui, dans les cas où le matériel évolue au rythme des secondes (exagération intensionnelle). Portable signifie aussi Furture-Prouvez. Donc, vous pourriez dire que cela a effectivement influencé la décision, même si ce n'est pas directement.
J'ai utilisé une langue dans environ 1980 qui avait une variable de $ de transport. Cependant, la question devrait être adressée à Dennis Ritchie. Tout ce que vous arrivez ici sera une hypothèse. Pas constructif.