Wie funktioniert C Ganzzahlliterale Griff mit führenden Nullen, und was Sie atoi?

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

  •  12-09-2019
  •  | 
  •  

Frage

Wenn Sie eine ganze Zahl mit führenden Nullen zu erstellen, wie funktioniert c damit umgehen? Ist es für verschiedene Versionen von C?

In meinem Fall, sie scheinen einfach fallen gelassen zu werden (aber vielleicht ist das, was printf tut?):

#include <stdio.h>

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

Ich weiß, ich printf-Pad mit 0s verwenden kann, aber ich bin nur gefragt, wie das funktioniert.

War es hilfreich?

Lösung

Führende Nullen zeigen an, dass die Zahl in ausgedrückt wird Oktal oder Basis 8; Somit 010 = 8. Zusätzliche führende Nullen Hinzufügen hat keine Wirkung; so wie Sie in Mathe, x + 0 * 8 ^ n = x erwarten würden; gibt es auf den Wert keine Änderung, indem sie mehr seine Darstellung.

Ein Ort, den Sie oft sehen, das ist in UNIX-Dateiarten; 0755 bedeutet eigentlich * 8 ^ 7 + 5 2 + 5 * 8 = 493; oder mit umasks wie 0022 = 2 · 8 + 2 = 10.

atoi(nptr) wird als gleichwertig mit strtol(nptr, (char **) NULL, 10) definiert, mit der Ausnahme, dass es keine Fehler erkennen - als solche, atoi() immer dezimal verwendet (und somit ignoriert führende Nullen). strtol(nptr, anything, 0) hat folgende Möglichkeiten:

  

Die Zeichenfolge kann mit einem beliebigen beginnen   Menge an weißen Raum (bestimmt   durch isspace(3)), gefolgt von einem einzigen   optional '+' oder '-' Zeichen. Wenn Base   Null oder 16, kann die Zeichenfolge dann   umfasst einen "0x" Präfix und die Nummer   16 wird in der Basis gelesen werden; andernfalls ein   Null-Basis wird als 10 (dezimal) getroffen   es sei denn, das nächste Zeichen wird '0', in   wobei es wird angenommen als 8 (Oktal).

So ist es die gleichen Regeln wie der C-Compiler verwendet.

Andere Tipps

Seien Sie vorsichtig!

In dieser Aussage 005 ist eine oktale Konstante ist.

int a = 005;

In diesem Fall spielt es keine Rolle, weil eine einzelne Ziffer Oktal konstant den gleichen Wert wie die äquivalente Dezimalkonstante hat aber in C: 015 != 15

Ob ein Ganzzahlliteral wird in oktal, dezimal oder hexadezimal ausgedrückt, wenn es durch den Compiler analysiert wird, es wird nur als Wert behandelt. Wie eine ganze Zahl ist Ausgabe über printf nur von seinem Typ abhängig ist, sein Wert und die Formatbezeich (und die aktiven locale).

Die Tatsache, dass eine führende Null zeigt eine Zahl Oktal ist etwas, das oft vergessen wird. Ich habe es Verwirrung mehrmals verursachen gesehen, wie wenn jemand versucht, eine IP-Adresse zur Eingabe eines schönen, regelmäßigen Format für die Oktetts mit:

192.168.010.073

und der Parser interpretiert die letzten 2 Bytes als Oktalzahlen.

Das einzige, was schlimmer ist als C unglückliche Verwendung von führenden Nullen eine Reihe Oktal machen Handling Javascript von führenden Nullen zu manchmal eine Reihe Oktal machen (die Zahl ist Oktal, wenn die restlichen Ziffern sind OK - weniger als 8 - dezimal anders). In Javascript, (017 == 15) aber (018 == 18).

Ich würde eher ein Fehler sein; Ich würde eigentlich eher fallen Oktal wörtliche Unterstützung insgesamt. Mindestens nutzen, um einen in-your-face-Präfix, wie vielleicht

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

Aber ich bin über 35 Jahre zu spät mit meinem Vorschlag.

Eine Zahl mit einer führenden Null bedeutet, Oktal-Codierung in allen Versionen von C. So 011 == 9 == 0x9.

Octal ist ein Nummerierungssystem, basierend auf 8 (anstelle von 10 für dezimale oder 16 für hex). So 011 == 1*8 + 1, 013 == 1*8 + 3, etc.

Sie sollten versuchen:

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

0 bedeutet "pad mit Nullen", 3 ist die gewünschte Länge des Ausgangs.

Edit: Sorry, ich habe Ihre Frage zu schnell lesen - jetzt sehe ich Ihnen etwas gefragt hat, völlig anders. Ich werde dies jedoch lassen wie es ist, wie es für jemand anderes könnte hilfreich sein.

Eine Zahl mit 0 führenden bezeichnet, dass die Zahl ist eine Oktal Nummer. Es ist Ganzzahlliterale genannt . Sie können auch 0b zur Bezeichnung Binärzahl verwenden, für Hexadezimalzahl es ist 0x oder 0X. Sie brauchen keine Sache für dezimal schreiben . Sehen Sie den Code unten.

#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);
}

Für weitere Informationen besuchen Sie tutorialspoint .

Die ganzen Zahlen haben keine „führende Nullen“ a 5 eine 5 ist, wird seine String-Darstellung mit führenden 0 schreiben können, wenn Sie möchten, für die Sie die printf Modifikatoren haben.

In Ihrem speziellen Fall, die Nullen von printf fallen gelassen werden. Alle führenden Nullen werden vom Compiler mit Ausnahme des anfänglichen Null gezupft, die der Compiler bewirkt, dass die ganze Zahl als Oktal zu behandeln. Für 005, sowohl die Oktal und Dezimaldarstellungen sind gleich und sollten Sie sich nicht die Mühe, aber immer noch, es ist nach Ärger, wenn Sie speziell die Oktaldarstellung gemeint.

Führende Nullen haben rein mit der Stringdarstellung der ganzen Zahl zu tun. Zum Drucken mit führenden Nullen, verwenden Sie „% 03d“. Dies wird eine Feldlänge von 3 gewährleisten.

In der Regel „% d“ wird eine ganze Zahl x Zeichen drucken breit und wird Pad mit führenden Leerzeichen. "% 0 d" wird das gleiche tun, aber Wille Pad mit führenden Nullen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top