#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.