HeadlinesBriefing HeadlinesBriefing.com

Operaciones de máscara de bits y promoción entera en C++

Hacker News •
×

Recientemente examiné P4313 R1, una propuesta de estándar que añade operaciones de máscara de bits para enums mediante una anotación C++26. El concepto central utiliza `[[=std::bitmask_type]]` para generar automáticamente operadores bit a bit, eliminando la necesidad de implementación manual. Aunque los compiladores C++ calculan felizmente operaciones bit a bit en tipos enteros, un detalle crítico involucra la promoción entera.

Tipos más pequeños que `int`, como `short`, se promueven a `int` antes de que ocorra la operación. Esto significa que el tipo de resultado de operaciones sobre tipos más pequeños predeterminadamente es `int`, requiriendo un `static_cast` de vuelta al tipo original para evitar comportamientos inesperados. Además, `bool` presenta peligros únicos.

La conversión booleana no truncada patrones de bits; en su lugar, mapea cualquier valor no cero a `true` (valor entero 1) y cero a `false`. Combinando estas reglas revela un extraño fenómeno: el complemento de `true` (`~true`) promueve `true` a `int` (valor 1), calcula el resultado del complemento de dos como `-2`, y dado que `-2` es no cero, la conversión booleana devuelve `true`. Por lo tanto, `static_cast(~true) == true`.

Este comportamiento se extiende a enums basados en `bool`, como aquellos definidos con `[[=std::bitmask_type]]`, destacando la importancia de entender estas conversiones implícitas para el desarrollo robusto en C++.

Fuente: Hacker News · Resumido por HeadlinesBriefing