Domanda

Quando si crea un intero con gli zeri, come si fa c gestirlo? E 'diverso per le diverse versioni di C?

Nel mio caso, sembrano proprio loro ad essere caduto (ma forse questo è ciò che fa printf?):

#include <stdio.h>

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

So che posso usare printf per pad con 0s, ma mi chiedo solo come funziona.

È stato utile?

Soluzione

zeri indicano che il numero è espresso in ottale , o base 8; così, 010 = 8. Aggiunta zeri aggiuntivi non ha effetto; proprio come ci si aspetterebbe in matematica, x + 0 * 8 ^ n = x; non c'è nessun cambiamento per il valore, rendendo la sua rappresentazione più.

Un posto si vedono spesso questo è in modalità file UNIX; 0755 significa in realtà 7 * 8 ^ 2 + 5 * 8 + 5 = 493; o con umask come 0022 = 2 * 8 + 2 = 10.

atoi(nptr) è definito come equivalente strtol(nptr, (char **) NULL, 10), salvo che non rileva errori - come tale, atoi() utilizza sempre decimale (e quindi ignora zeri). strtol(nptr, anything, 0) fa il seguente:

  

La stringa può iniziare con un arbitrario   quantità di spazio bianco (come determinato   da isspace(3)) seguito da un singolo   '+' opzionale o segno '-'. Se la base è   zero o 16, la stringa può allora   includere un prefisso "0x", e il numero   verrà letto in base 16; in caso contrario, un   Base zero viene preso come 10 (decimale)   a meno che il carattere successivo è '0', in   qual caso viene preso come 8 (ottale).

Quindi usa le stesse regole come il compilatore C.

Altri suggerimenti

Fare attenzione!

In questa dichiarazione 005 è una costante ottale.

int a = 005;

In questo caso non importa poiché un singolo costante cifra ottale ha lo stesso valore della costante decimale equivalente ma in C: 015 != 15

Se un letterale intero è espresso in ottale, decimale o esadecimale, una volta che viene analizzato dal compilatore è appena trattato come un valore. Come un numero intero viene emesso tramite printf dipende solo dal suo tipo, il suo valore e gli identificatori di formato (e internazionale attiva).

Il fatto che uno zero indica un numero è ottale è qualcosa che è spesso dimenticato. L'ho visto causare confusione più volte, ad esempio quando qualcuno ha cercato di inserire un indirizzo IP utilizzando un bel formato, regolare per gli ottetti:

192.168.010.073

e il parser interpretato le ultime 2 ottetti come numeri ottali.

L'unica cosa peggiore di uso sfortunato del C di zeri per fare un numero ottale è la gestione di JavaScript di zeri iniziali per a volte fare un numero ottale (il numero è ottale se il resto delle cifre sono OK - meno di 8 - decimali altrimenti). In Javascript, ma (017 == 15) (018 == 18).

preferirei ci sia un errore; in realtà preferirei abbandonare il supporto ottale letterale del tutto. Almeno utilizzare un prefisso di più in-your-face, come forse

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

Ma sono circa 35 anni di ritardo con la mia proposta.

Un numero con uno zero significa codifica ottale in tutte le versioni di C. Quindi 011 == 9 == 0x9.

ottale è un sistema di numerazione basato su 8 (invece di 10 per decimale o 16 per esagono). Così 011 == 1*8 + 1, 013 == 1*8 + 3, ecc.

Si dovrebbe provare:

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

0 significa "pad con zeri", 3 è la lunghezza desiderata di uscita.

Modifica Spiacenti, ho letto la tua domanda troppo in fretta - ora vedo che hai chiesto di qualcosa di completamente diverso. Tuttavia Lascio questo come è, come potrebbe essere utile per qualcun altro.

Un numero con leader 0 indicato che il numero è un ottale numero. Si chiama Intero letterali . È inoltre possibile utilizzare 0b per denotare numero binario , per numero esadecimale è 0x o 0X. Non è necessario scrivere qualsiasi cosa per decimale . Vedere il codice qui sotto.

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

Per ulteriori informazioni visita il sito tutorialspoint .

I numeri interi non hanno "zeri iniziali" un 5 è un 5, è possibile scrivere la sua rappresentazione di stringa con 0 iniziale, se si desidera, per di avere i modificatori printf.

Nel tuo caso particolare, gli zeri sono diminuite del printf. Tutti gli zeri iniziali vengono eliminati dal compilatore tranne che per lo zero iniziale, che fa sì che il compilatore di trattare l'intero come ottale. Per 005, sia l'ottale e rappresentazioni decimali sono gli stessi e non dovrebbero preoccuparsi, ma ancora, è in cerca di guai se non si intende in particolare la rappresentazione ottale.

zeri iniziali hanno a che fare esclusivamente con la rappresentazione di stringa del numero intero. Per stampare con zeri iniziali, usare "% 03d". Ciò garantirà una lunghezza di campo di 3.

In generale, "% d" stamperà un intero x caratteri di larghezza e pad con spazi iniziali. "% 0 d" farà la stessa cosa ma pad con zeri iniziali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top