Гарантируется ли переполнение битового поля без знака циклическим переносом? - PullRequest
0 голосов
/ 15 января 2019

Подробности

Ссылка для битовых полей в cppreference представляет следующий пример:

#include <iostream>
struct S {
 // three-bit unsigned field,
 // allowed values are 0...7
 unsigned int b : 3;
};
int main()
{
    S s = {7};
    ++s.b; // unsigned overflow (guaranteed wrap-around)
    std::cout << s.b << '\n'; // output: 0
}

Акцент на гарантированобтекание комментарий.

Тем не менее, WG21 CWG Issue 1816 описывает некоторые возможные проблемы с нечеткой спецификацией значений битовых полей и [expr.post.incr] / 1 в последнем стандартечерновик состояний:

Значением выражения postfix ++ является значение его операнда....

Если операндом является битовое поле, которое не может представлять увеличенное значение, результирующее значение битового поля определяется реализацией.

Я не увереноднако, если это применимо также для переноса битовых полей без знака.

Вопрос

  • Гарантируется ли переполнение битового поля без знака для циклического переноса?

1 Ответ

0 голосов
/ 15 января 2019

Оба [expr.pos]/1 и [expr.ass]/6 согласны с тем, что целочисленное переполнение битового поля (со знаком или без знака) определяется реализацией.

[expr.pos]/1

[...] Если операндом является битовое поле, которое не может представлять увеличенное значение, результирующее значение битового поля определяется реализацией.

[expr.ass]/6

Когда левый операнд оператора присваивания является битовым полем, которое не может представлять значение выражения, результирующее значение битового поля определяется реализацией.

Я исправил страницу cppreference. Спасибо, что заметили.

...