O que a calculadora mostra
Digite os doze primeiros caracteres de um CNPJ, a raiz e a ordem, sem os dígitos verificadores. A calculadora monta duas tabelas, uma para cada dígito, com quatro linhas:
- Caractere: cada posição da base, na ordem em que aparece.
- Valor: o número que esse caractere representa no cálculo (ASCII − 48).
- Peso: o multiplicador daquela posição.
- Produto: valor vezes peso.
Abaixo de cada tabela aparecem a soma dos produtos, o resto da divisão por 11 e o dígito resultante. No fim, a ferramenta mostra o CNPJ completo, já com a máscara. A entrada aceita minúsculas e ignora pontuação, inclusive ao colar: tudo é convertido para maiúsculas, reduzido a [A-Z0-9] e limitado a doze caracteres antes do cálculo.
O valor inicial do campo é 12ABC34501DE, base do CNPJ de exemplo 12.ABC.345/01DE-35. Troque qualquer caractere e as tabelas são recalculadas na hora, o que é a forma mais rápida de ver como uma única posição altera os dois dígitos. Para conferir um CNPJ completo, use o validador de CNPJ.
CNPJ alfanumérico
Desde julho de 2026, novas inscrições de CNPJ podem incluir letras nas doze primeiras posições, mas os dois dígitos verificadores continuam sendo sempre numéricos. O cálculo não muda de algoritmo: cada letra entra na soma pelo seu valor ASCII menos 48, o que dá 17 para A e 42 para Z, enquanto os dígitos de 0 a 9 valem eles mesmos. Por isso a mesma função serve para CNPJs antigos e novos, sem nenhum if separado para o formato. Para entender o que isso muda em cadastros, bancos de dados e integrações já existentes, veja o guia CNPJ alfanumérico: o que muda no seu sistema.
Valor dos caracteres: ASCII − 48
O CNPJ alfanumérico, emitido pela Receita Federal para novas inscrições desde julho de 2026 (IN RFB nº 2.229/2024), precisou de uma regra para transformar letras em números sem alterar o cálculo dos CNPJs já existentes. A solução foi usar o código ASCII do caractere menos 48. Como o código ASCII de 0 é 48, os dígitos continuam valendo 0 a 9. As letras maiúsculas começam em 65, então A vale 17:
| Letra | Valor | Letra | Valor | Letra | Valor |
|---|---|---|---|---|---|
| A | 17 | J | 26 | S | 35 |
| B | 18 | K | 27 | T | 36 |
| C | 19 | L | 28 | U | 37 |
| D | 20 | M | 29 | V | 38 |
| E | 21 | N | 30 | W | 39 |
| F | 22 | O | 31 | X | 40 |
| G | 23 | P | 32 | Y | 41 |
| H | 24 | Q | 33 | Z | 42 |
| I | 25 | R | 34 |
Em quase todas as linguagens, a conversão é uma linha: c.charCodeAt(0) - 48 em JavaScript, ord(c) - 48 em Python, Ord(c) - 48 em Delphi. Só funciona com maiúsculas: em ASCII, a vale 97, o que daria 49 e um dígito errado. Por isso a entrada deve passar por toUpperCase antes do cálculo.
Pesos 5..2/9..2 e 6..2/9..2
Os pesos do CNPJ não descem continuamente, como no CPF. Eles seguem um ciclo de 2 a 9, contado da direita para a esquerda:
- Primeiro dígito, sobre 12 posições: 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2.
- Segundo dígito, sobre 13 posições (a base mais o primeiro dígito): 6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2.
Lidos da direita para a esquerda, os dois começam em 2, sobem até 9 e recomeçam em 2. O segundo tem um peso a mais à esquerda porque cobre uma posição a mais. No CNPJ de exemplo, as somas ficam assim:
Base: 1 2 A B C 3 4 5 0 1 D E
Valor: 1 2 17 18 19 3 4 5 0 1 20 21
Peso 1º: 5 4 3 2 9 8 7 6 5 4 3 2 -> soma 459
Peso 2º: 6 5 4 3 2 9 8 7 6 5 4 3 (+ 3 x 2) -> soma 424
No segundo dígito, o 3 calculado na primeira etapa entra como 13ª posição, com peso 2. O código abaixo gera os pesos a partir do ciclo, em vez de escrevê-los à mão:
const pesos = (n) => Array.from({ length: n }, (_, i) => ((n - 1 - i) % 8) + 2);
function digito(chars) {
const p = pesos(chars.length);
let soma = 0;
for (let i = 0; i < chars.length; i++) soma += (chars.charCodeAt(i) - 48) * p[i];
const resto = soma % 11;
return resto < 2 ? 0 : 11 - resto;
}
const base = '12ABC34501DE';
const dv1 = digito(base); // 3 (soma 459, resto 8)
const dv2 = digito(base + dv1); // 5 (soma 424, resto 6)pesos(12) devolve [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2] e pesos(13) devolve [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2].
Resto 0 ou 1
Depois da soma, calcula-se o resto da divisão por 11. Se o resto for 2 ou mais, o dígito é 11 menos o resto. Se for 0 ou 1, a conta daria 11 ou 10, que não cabem em uma posição, e o dígito é 0.
Dois exemplos com a mesma raiz numérica mostram os dois casos:
11.222.333/0005-05: a soma do primeiro dígito é 110, que é múltiplo de 11. Resto 0, dígito 0.11.222.333/0014-04: a soma do primeiro dígito é 111. Resto 1, dígito 0.
Esquecer essa regra é um erro frequente em implementações caseiras, e ele aparece só em uma fração dos números, o que faz o bug passar despercebido em testes com poucos casos. Inclua na sua suíte pelo menos uma base que caia em cada um dos restos 0 e 1. Na mesma raiz, 11.222.333/0001-81 mostra o caso oposto no segundo dígito: soma 120, resto 10, dígito 1.
Diferenças para o CPF
O CPF e o CNPJ usam o mesmo princípio, o módulo 11 com a regra do resto 0 ou 1, mas diferem em quase todo o resto:
| CPF | CNPJ | |
|---|---|---|
| Base | 9 dígitos | 12 caracteres (raiz + ordem) |
| Caracteres | só dígitos | dígitos e, desde 2026, letras de A a Z |
| Valor do caractere | o próprio dígito | ASCII − 48 |
| Pesos do 1º dígito | 10 a 2 | 5 a 2, depois 9 a 2 |
| Pesos do 2º dígito | 11 a 2 | 6 a 2, depois 9 a 2 |
| Informação na base | 9º dígito indica a região fiscal | ordem indica o estabelecimento |
Uma função de CPF não serve para CNPJ só trocando o tamanho, porque os pesos são outros. O cálculo do CPF está detalhado na calculadora de dígitos do CPF e no guia do algoritmo de validação pelo módulo 11.
Usar em provas e entrevistas
Validar CNPJ é um exercício comum em testes técnicos, e o formato alfanumérico deixou o problema mais interessante: além de laços e aritmética modular, ele cobre conversão de caracteres e tratamento de texto. Pontos que separam uma resposta completa de uma parcial:
- Converter para maiúsculas e limpar a entrada, mantendo
[A-Z0-9], e não apenas dígitos. - Conferir o tamanho e o formato: 14 caracteres, com os dois últimos obrigatoriamente numéricos.
- Rejeitar sequências repetidas, como
00.000.000/0000-00. - Usar ASCII − 48 para obter o valor de cada caractere.
- Aplicar os pesos cíclicos e a regra do resto 0 ou 1 nos dois dígitos.
- Tratar o CNPJ como texto, nunca como número.
Vale saber explicar também o que a validação não faz: ela não diz se o CNPJ foi emitido nem se a empresa está ativa. Implementações de referência estão nas páginas de JavaScript, Python, Java e C#, e o guia sobre a estrutura do CNPJ explica o papel da raiz e da ordem.