quinta-feira, 15 de janeiro de 2015

C++14: Finalmente teremos um literal binário!

O novo standard da linguagem, C++14 já foi aprovado pelo comitê e está aguardando publicação pela ISO. Mesmo assim, diversos compiladores já estão implementando algumas das novas funcionalidades para testarmos. É uma pequena revisão na linguagem, nada radical, comparado com o C++11.

Umas das novidades que eu aguardava a mais tempo é possibilidade de codificar literais em binário. Até então tínhamos as opções de codificar literais numéricos inteiros em decimal, octal e hexadecimal:

n = 241;    // Decimal, pois inicia com dígitos 1..9
n = 0361;   // Octal, por causa do prefixo 0  (3618==24110)
n = 0xF1;   // Hexa, por causa do prefixo 0x (F116==24110)


A nova versão está incluindo um prefixo para notação de literais em binário. É o 0b (ou 0B).

n = 0b11110001;    // Binário (111100012==24110)

A notação hexadecimal é apenas uma forma abreviada de escrever valores binário e, geralmente, mais recomendada, pois temos mais chances de erros de  digitação e pior leitura em um número com 16 dígitos binários do que apenas quatro hexadecimais. Ou você prefere "1010000001010000" do que "A050"? Mesmo assim, em algumas situações específicas, os literais binários são úteis, como na criação de máscara para fazer operação and bit-a-bit a fim de testar bits individuais dentro de um número. Meus (ex-)alunos de Arquitetura e Organização de Computadores que tiveram que implementar um montador/simulador de arquitetura de 8 bits, por exemplo, poderiam ter aproveitado este recurso se já estivesse disponível.


Compilando com o gcc/g++


Como é um padrão ainda não publicado da linguagem,  está disponível apenas em caráter experimental em muitos compiladores. O GNU já tinha uma extensão para estes literais antes mesmo de ser aprovado pelo comitê.

A documentação do g++ cita que deve ser usada a chave -std=c++14, a partir do GCC 4.8. Eu, porém, para conseguir compilar no Ubuntu 14.04, com GCC 4.8.2 precisei usar a chave -std=c++1y. (com a -std=c++11 já funcionaria por causa daquela extensão).

g++ -std=c++1y testbin.cpp

1
2
3
4
5
6
7
8
9
#include <iostream>

int main()
{
    int n{0b11110001};

    std::cout << n << '\n';
    return 0;
}



Nenhum comentário:

Postar um comentário