Указатель арифметической путаницы или странного поведения

cat /dev/urandom | tr -dc 'a-ZA-Z0-9'
0
задан Elliot 16 January 2019 в 19:51
поделиться

2 ответа

Вам нужно 0x400000B0 * 4L, иначе умножение переполнится.

0
ответ дан David Schwartz 16 January 2019 в 19:51
поделиться

Я предполагаю, что ответ Дэвида работает для некоторых компиляторов, но в компиляторе Microsoft я все же получил предупреждения и тот же результат. В какой-то документации на C ++ я заметил, что «long» обеспечивает только «ширину не менее 32 бит». Поэтому я изменил тип переменной и тип выражения на long long;

long long _varLLxxLL = 0x400000B0 * 4LL;
std::cout << "_varLLxxLL has value " << _varLLxxLL 
          << ", the expression had type " << typeid(0x400000B0 * 4LL).name() << "\n";

Вывод:

_varLLxxLL имеет значение 4294968000, выражение имело тип __int64

Сравнить с:

long _varLxxxLx = 0x400000B0 * 4L;
std::cout << "_varLxxxLx has value " << _varLxxxLx 
          << ", the expression had type " << typeid(0x400000B0 * 4L).name() << "\n";

Вывод:

_varLxxxLx имеет значение 704, выражение имеет тип long

оставьте вопрос открытым пока.

0
ответ дан Elliot 16 January 2019 в 19:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: