Работает ли std::bitset на 32-разрядных машинах для uint64_t?

#c

#c

Вопрос:

Приведенный ниже вывод кода на 32-разрядной машине Linux (RHEL6) с компилятором Intel с включенным -std =c 11 похож на приведенный ниже — почему?

 uint64_t a = UINT64_MAX;
std::cout << std::bitset<64>(a) << std::endl;
  

Вывод на 32-разрядной машине:

 0000000000000000000000000000000011111111111111111111111111111111
  

Вывод на 64-разрядной машине:

 1111111111111111111111111111111111111111111111111111111111111111
  

Комментарии:

1. Отличается ли вывод на 64-разрядной машине?

2. Потому что std::bitset сломан до C 11 — имеет конструктор, принимающий unsigned long 32-разрядный тип в 64-разрядной Windows.

3. Какие типы разрешены для конструктора std::bitset ?

4. Этого НЕТ в Windows — он использует компилятор Intel в 32-разрядном Linux с -std =c 11

5. не могли бы вы, пожалуйста, предоставить свою команду для компиляции? также какой компилятор вы используете? какая ОС?

Ответ №1:

Работает ли std::bitset<64> на 32-разрядных машинах для uint64_t?

Да, начиная с C 11.

До C 11 конструктор принимал unsigned long , который гарантированно должен быть только 32 бита или больше. Когда размер набора битов превышает количество битов в long (до C 11) или long long (начиная с C 11), переполненные биты инициализируются равными 0.

Можно использовать большие наборы битов, но старшие биты не могут быть инициализированы с помощью этого конструктора или соблюдены с помощью to_ulong .

Комментарии:

1. @pmoubed Тогда реализация этого языка не соответствует стандарту C 11.

2. icpc (ICC) 15.0.3 20150407 — software.intel.com/content/www/us/en/develop/articles /…

3. @pmoubed Согласно этой документации Linux: Note that language features available can depend on gcc* version installed Вам следует проверить, поддерживает ли ваша стандартная библиотека C 11.