Я начинаю C, и меня смущает следующий пример, найденный в книге ответов C.
Один из способов найти размер unsigned long long в вашей системе - это ввести:
printf("%llu", (unsigned long long) ~0);
Я не знаю, почему этот синтаксис работает?
В моей системе int
- 32 бита, а long long
- 64 бита.
Я ожидал, что, поскольку 0
является константой целочисленного типа, ~0
вычисляет отрицание 32-битного целого числа, которое затем преобразуется в unsigned long long
оператором литья. В результате это должно дать 2 32 - 1.
Как бы то ни было, похоже, что оператор ~
уже знает, что он должен действовать на 64 бита?
Компилятор интерпретирует эту инструкцию как printf("%llu", ~(unsigned long long)0);
? Это не звучит правильно, так как литье и ~
имеют одинаковый приоритет.