Comment C Poignée Integer littéraux avec des zéros en tête, Qu'en est-atoi?

StackOverflow https://stackoverflow.com/questions/1661369

  •  12-09-2019
  •  | 
  •  

Question

Lorsque vous créez un entier avec des zéros, comment ne c gérer? Est-ce différent pour les différentes versions de C?

Dans mon cas, ils semblent être abandonné (mais peut-être est ce printf fait?):

#include <stdio.h>

int main() {
    int a = 005;
    printf("%i\n", a);
    return 0;
}

Je sais que je peux utiliser printf pour pad avec 0s, mais je me demande comment cela fonctionne.

Était-ce utile?

La solution

Les zéros à gauche indiquent que le nombre est exprimé dans octal , ou la base 8; ainsi, 010 = 8. Ajout des zéros non significatifs supplémentaires n'a aucun effet; comme on peut s'y attendre en mathématiques, x + 0 * 8 ^ n = x; il n'y a pas de changement à la valeur en faisant sa représentation plus.

Un endroit que vous voyez souvent c'est en mode de fichiers UNIX; 0755 signifie en fait 8 * 7 ^ 2 + 5 * 8 + 5 = 493; ou avec umasks tel que 0022 = 2 * 8 + 2 = 10.

atoi(nptr) est défini comme équivalent à strtol(nptr, (char **) NULL, 10), sauf qu'il ne détecte pas d'erreurs - en tant que telle, atoi() utilise toujours décimal (et ne tient donc pas des zéros non significatifs). strtol(nptr, anything, 0) effectue les opérations suivantes:

  

La chaîne peut commencer par un arbitraire   quantité d'espace blanc (tel que déterminé   par isspace(3)) suivi d'un seul   option '+' ou signe '-'. Si la base est   zéro ou 16, la chaîne peut alors   inclure un préfixe "0x", et le nombre   sera lu dans la base 16; sinon, un   la base est prise comme zéro 10 (en décimal)   à moins que le caractère suivant est '0', en   auquel cas il est 8 (octal).

Il utilise les mêmes règles que le compilateur C.

Autres conseils

Attention!

Dans cette déclaration 005 est une constante octal.

int a = 005;

Dans ce cas, il n'a pas d'importance, car une constante octal seul chiffre a la même valeur que la constante décimale équivalente mais en C: 015 != 15

Que s'exprime un entier littéral octal, décimal ou hexadécimal, une fois qu'il est analysé par le compilateur, il est tout simplement considéré comme une valeur. Comment un nombre entier est émis par l'intermédiaire d'printf ne dépend que de son type, sa valeur et les spécificateurs de format (et la locale active).

Le fait qu'un zéro indique un nombre est octal est quelque chose qui est souvent oublié. Je l'ai vu plusieurs fois causer de la confusion, par exemple quand quelqu'un a essayé d'entrer une adresse IP à l'aide d'un beau format régulier pour les octets:

192.168.010.073

et l'analyseur interprété les 2 derniers octets comme nombre octal.

La seule chose pire que l'utilisation malheureuse des principaux zéros de C pour faire un octal numérique est la gestion de Javascript de conduire des zéros à parfois faire un octal numéro (le numéro est octal si le reste des chiffres sont OK - moins de 8 - décimale autrement). En Javascript, mais (017 == 15) (018 == 18).

Je préférerais y ait une erreur; en fait, je préfère laisser tomber le soutien octal littéral tout à fait. Au moins utiliser un plus votre visage préfixe, comme peut-être

0t10  (ocTal 8)
0k17  (oKtal 15)

Mais je suis 35 ans trop tard avec ma proposition.

Un nombre avec un zéro moyen de codage octal dans toutes les versions de C. Donc 011 == 9 == 0x9.

Octal est un système de numérotation basé sur 8 (au lieu de 10 pour décimal ou 16 pour hex). Alors 011 == 1*8 + 1, 013 == 1*8 + 3, etc.

Vous devriez essayer:

int a = 5;
printf("%03i\n", a);

0 signifie "pad avec des zéros", 3 est la longueur souhaitée de la sortie.

Modifier Désolé, j'ai lu votre question trop rapidement - maintenant, je vois que vous avez posé des questions sur quelque chose de complètement différent. Cependant, je vais laisser cela tel quel, car il pourrait être utile pour quelqu'un d'autre.

Un certain nombre de diriger 0 noté que le nombre est un octal N °. Il est appelé Entier littéraux . Vous pouvez également utiliser 0b pour désigner nombre binaire , pour nombre hexadécimal il est 0x ou 0X. Vous n'avez pas besoin d'écrire quelque chose pour décimal . Voir ci-dessous le code.

#include<stdio.h>

int main()
{
    int binary = 0b10;
    int octal=010;
    int decimal = 10;
    int hexa = 0x10;
    printf("%d %d %d %d\n", octal, decimal, hexa, binary);
}

Pour plus d'informations, visitez tutorialspoint .

Entiers n'ont pas « des zéros à gauche » un 5 est un 5, vous pouvez écrire sa représentation chaîne avec le 0 si vous voulez, pour que vous avez les modificateurs printf.

Dans votre cas, les zéros sont abandonnées par printf. Tous les zéros à gauche sont supprimés par le compilateur à l'exception du zéro initial qui provoque votre compilateur pour traiter l'entier comme octal. Pour 005, à la fois la octal et les représentations décimales sont les mêmes et ne devraient pas vous déranger, mais encore, il est d'avoir des ennuis à moins que vous vouliez dire précisément la représentation octal.

Les zéros à gauche doivent faire uniquement avec la représentation de chaîne de l'entier. Pour imprimer avec des zéros non significatifs, utilisez « % 03d ». Cela permettra d'assurer une longueur de champ de 3.

En général, « % d » imprimera un caractère x entier large et pavé volonté par des espaces. "% 0 d" va faire la même chose, mais avec volonté pad zéros à gauche.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top