2015-12-12 4 views
-2

C, C++, C#, Java, Rust, etc. ont signé int s par défaut. La plupart du temps, vous voulez variables non signées, puisque les cas où vous devez représenter quelque chose qui peut être inférieur à zéro sont moins fréquents que les cas où vous traitez avec des nombres naturels. De plus, les variables non signées ne doivent pas être codées sous forme de complément à 2 et ont le bit le plus significatif pour une plage de valeurs supplémentaire.Pourquoi les variables de type int sont-elles signées par défaut dans de nombreuses langues?

Compte tenu de tout cela, pourquoi les créateurs de langages font-ils des ints signés par défaut?

+2

"La plupart du temps, vous voulez des variables non signées, car les cas où vous devez représenter quelque chose qui peut être inférieur à zéro sont moins fréquents que les cas où vous traitez des nombres naturels." Avez-vous des études à l'appui de cette affirmation fascinante? – dasblinkenlight

+0

En repensant aux questions de SO C, il est assez difficile de trouver des ints négatifs utilisés pour quoi que ce soit, sauf '-1' pour une erreur. –

+0

@dasblinkenlight, non, je n'ai pas. Je ne suis pas un programmeur expérimenté, mais pour moi, il semble que ma déclaration soit vraie. Vous traitez avec des tailles, des indeces, des comptes, des codes d'erreur, etc. plus qu'avec quelque chose de négatif, n'est-ce pas? –

Répondre

5

Je pense que votre affirmation de base est fausse. Les nombres négatifs sont très communs dans la vraie vie. Pensez aux températures, aux soldes des comptes bancaires, aux questions et réponses. La modélisation des données physiques en informatique nécessite un moyen naturel d'exprimer des quantités négatives.

En effet le deuxième exemple en Le langage de programmation C de Brian Kernighan et Dennis Ritchie est un programme pour convertir les températures entre les échelles Fahrenheit et Celcius. C'est leur tout premier exemple d'application numérique du langage C.

tailles Array sont des nombres positifs en effet, mais les décalages de pointeur peut être négatif en C.

D'autres langues telles que Ada spécifier la plage pour les variables numériques, mais le calcul arithmétique suppose toujours la continuité à 0 et les nombres négatifs sont impliqués par ce.

Arithmétique non signée, comme spécifié dans C est réellement confus: 1U - 2U est supérieur à 0, tout comme -1U. Faire cela par défaut serait tellement contre-intuitif!

+0

Je ne suis pas sûr que les "étages" de l'ascenseur soient un bon cas, car ils vont parfois comme ceci: B (sous-sol), G (rez-de-chaussée), M (mezzanine), 1 (premier étage). La plupart de ces étiquettes ne sont pas réellement des nombres, et aucun d'eux n'est des nombres négatifs. – svick

+1

@svick: bienvenue aux différences culturelles. D'où je viens, ils vont '-2',' -1', '0',' 1', '2' ... Dans d'autres parties du monde, ils commencent à' 1', des niveaux de sous-sol particuliers et vers les étages supérieurs, ils sautent même '13'. Laissez-moi penser à un meilleur exemple. – chqrlie

0

Python fait défaut signé INT piscine pour représenter -128 à 127 (peut-être une autre plage, et en modifiant le code source, vous pouvez faire ce bassin plus ou moins) à utiliser INT par référence. Cela permet à Python de travailler plus vite car chaque fois que vous avez besoin d'un INT de cette portée, il doit ajouter un objet INT.

Et, personnellement, j'utilise habituellement des nombres négatifs comme valeur de retour pour de mauvaises choses. Mettez-le ensemble, je pense qu'il y a beaucoup de changements pour utiliser de petits nombres négatifs, et cela rend la valeur par défaut int signée.

1

Dans ce que quelqu'un poste ne répondre à votre question: Default int type: Signed or Unsigned?

citation même que la réponse acceptée à ce poste:

Sur Unsigned Entiers

Certaines personnes, y compris certains auteurs de manuels scolaires, recommande d'utiliser des types non signés pour représenter des nombres qui ne sont jamais négatifs. Ceci est prévu comme une forme d'auto-documentation. Cependant, en C, les avantages d'une telle documentation sont compensés par les vrais bogues qu'elle peut introduire. Envisager:

for (unsigned int i = foo.Length()-1; i >= 0; --i) ... Ce code va ne jamais se terminer!Parfois, gcc remarquera ce bug et vous avertira, mais cela n'arrivera pas souvent. Des bogues aussi mauvais peuvent se produire en comparant les variables signées et non signées. Fondamentalement, le schéma de promotion de type de C provoque types non signés à se comporter différemment que ce à quoi on pourrait s'attendre. Donc, documenter qu'une variable est non-négative en utilisant des assertions. Ne pas utiliser un type non signé.

+0

Tout compilateur correct équipé du niveau d'avertissement approprié émet un diagnostic sur le fait que le test est toujours vrai. Un meilleur idiome pour cette boucle est: 'pour (non signé int i = foo.Length(); i--> 0;) {...}' – chqrlie

2

Il va un très long chemin dans le temps:

  • Entiers (et) étaient reals (seulement) ont signé dans les premières versions de Fortran, Algol et Lisp vers 1960. (COBOL est l'exception majeure.) La même chose s'applique aux langues de l'ère des années 70 comme Pascal et BCPL.

  • EDSAC (1949) prenait en charge (uniquement) les numéros signés.

En fait, C était une si les premières langues qui ont soutenu non signés entiers. Alors, pourquoi les créateurs de langues devraient-ils faire signer ints par défaut? Eh bien, l'une des raisons est que, avant l'ère C, les entiers signés étaient le seul type qui était disponible. Il était donc naturel de faire le défaut.

L'autre raison est que les cas d'utilisation qui nécessitent des nombres signés sont en réalité beaucoup plus communs que vous ne le pensez. Et il existe une autre classe de cas d'utilisation où il importe peu que les entiers soient signés ou non.

+1

Alors que la plupart du début du langage C a été conçu en 1973, 'unsigned' les types ont été ajoutés à la langue en 1977. Lire cet article très intéressant sur * Le développement du langage C * par Dennis M. Richie: https://ropas.snu.ac.kr/~kwang/4190.310/sociology/c- history.pdf – chqrlie