Como o C Manipular inteiros literais com zeros à esquerda, e What About atoi?

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

  •  12-09-2019
  •  | 
  •  

Pergunta

Quando você cria um inteiro com zeros à esquerda, como é que c lidar com isso? É diferente para diferentes versões do C?

No meu caso, eles só parecem ser abandonada (mas talvez isso é o que printf faz?):

#include <stdio.h>

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

Eu sei que posso usar printf para preencher com 0s, mas estou me perguntando como isso funciona.

Foi útil?

Solução

Zeros indicam que o número é expressa em octal , ou de base 8; assim, 010 = 8. Adição de zeros adicionais não tem nenhum efeito; tal como seria de esperar em matemática, x + 0 * 8 ^ n = x; não há nenhuma alteração no valor, fazendo a sua representação mais tempo.

Um lugar que você vê frequentemente este está em modos de arquivo UNIX; 0755 significa, na verdade, 7 * 8 ^ 2 + 5 * 8 + 5 = 493; ou com umasks tais como 0022 = 2 * 8 + 2 = 10.

atoi(nptr) é definido como equivalente a strtol(nptr, (char **) NULL, 10), exceto que ele não detectar erros - como tal, atoi() sempre usa decimal (e, portanto, ignora zeros à esquerda). strtol(nptr, anything, 0) faz o seguinte:

A seqüência pode começar com uma arbitrária quantidade de espaço branco (como determinado por isspace(3)) seguido por uma única '+' opcional ou sinal '-'. Se base é zero ou 16, a cadeia pode então incluem um prefixo "0x", e o número vai ser lido da base 16; de outro modo, uma base de zero é tomada como 10 (decimal) a menos que o próximo caractere é '0', em que caso ele é tomado como 8 (octal).

Então, ele usa as mesmas regras que o compilador C.

Outras dicas

Tenha cuidado!

Neste 005 declaração é uma constante octal.

int a = 005;

Neste caso, não importa, porque uma única constante dígito octal tem o mesmo valor que a constante decimal equivalente, mas em C: 015 != 15

Se um número inteiro literal é expressa em octal, decimal ou hexadecimal, uma vez que é analisado pelo compilador que é apenas tratado como um valor. Como um inteiro é emitido através printf depende apenas de seu tipo, seu valor e os especificadores de formato (e da região activa).

O fato de que um zero à esquerda indica um número é octal é algo que é muitas vezes esquecido. Eu já vi isso causa confusão várias vezes, como quando alguém tentou introduzir um endereço IP usando um agradável, formato regular para os octetos:

192.168.010.073

eo analisador interpretado últimos 2 octetos como números octais.

A única coisa pior do que o uso infeliz de C de zeros à esquerda para fazer um número octal é a manipulação do Javascript de zeros à esquerda para às vezes fazer um octal número (o número é octal se o resto dos dígitos são OK - menos de 8 - decimal contrário). Em Javascript, (017 == 15) mas (018 == 18).

Eu prefiro não ser um erro; na verdade eu prefiro cair octal apoio literal completamente. Pelo menos usar um prefixo mais in-your-face, como talvez

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

Mas estou cerca de 35 anos mais tarde com a minha proposta.

Uma série com um meio zero octal que codifica em todas as versões de C. Assim 011 == 9 == 0x9.

Octal é um sistema de numeração com base em oito (em vez de 10 em decimal ou 16 para hex). Então 011 == 1*8 + 1, 013 == 1*8 + 3, etc.

Você deve tentar:

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

"almofada com zeros" 0 significa, 3 é o comprimento desejado de saída.

Editar: Desculpe, eu li a sua pergunta muito rapidamente - agora eu vejo que você perguntou sobre algo completamente diferente. No entanto Vou deixar isso como é, como pode ser útil para alguém.

Um número com os principais 0 denotado que o número é uma octal número. É chamado inteiros literais . Você também pode usar 0b para denotar número binário , por número hexadecimal é 0x ou 0X. Você não precisa escrever qualquer coisa para decimal . Veja o código abaixo.

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

Para obter mais informações, visite tutorialspoint .

Os inteiros não têm "zeros" a 5 fica a 5, você pode escrever sua representação de seqüência com os principais 0, se quiser, para que você tenha os modificadores de printf.

No seu caso particular, os zeros estão sendo caiu printf. Todos os zeros à esquerda são retirados pelo compilador exceto para zero inicial, que faz com que o compilador para tratar o inteiro como octal. Para 005, tanto o octal e representações decimais são os mesmos e não deve incomodá-lo, mas ainda assim, ele está pedindo para ter problemas a menos que você especificamente destinado a representação octal.

Os zeros à esquerda tem que fazer puramente com a representação de string do número inteiro. Para imprimir com zeros à esquerda, use "% 03d". Isso irá garantir um comprimento de campo de 3.

Em geral, "% d" irá imprimir um inteiro x caracteres largos e pad vontade com espaços à esquerda. "% 0 d" vai fazer a mesma coisa, mas pad vontade com zeros à esquerda.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top