Intereting Posts
Существуют ли точки последовательности в выражении a ^ = b ^ = a ^ = b, или она не определена? ‘pwd’, чтобы получить путь к текущему файлу Разрешено ли глобальным статическим идентификаторам начинаться с одного _? C – Как вы называете первый элемент связанного списка? Препроцессор C с использованием закрывающей скобки родительского макроса Использование нескольких файлов тегов сразу в организации vim / Tag в целом создание указателей Typedef для структур Typedef в C Получить список устройств в локальной сети на C PlaySound в C звучит, но не воспроизводит wav-файл Руководство по созданию собственной библиотеки для разработки cocoa (touch) Как вы называете функцию сборки из программы C? Добавление пути к каталогу Windows 8.1 Создание текста в printf отображается зеленым и красным цветом вызов функции в C Есть ли библиотека MD5, которая не требует всего ввода в одно и то же время?

C интерпретация шестнадцатеричного длинного целочисленного литерала “L”

Как компилятор C интерпретирует «L», который обозначает длинный целочисленный литерал, в свете автоматического преобразования? Следующий код при запуске на 32-битной платформе (32-разрядная, 64-разрядная длинная) кажется отличным выражением «(0xffffffffL)» в 64-разрядное целое число 4294967295, а не 32-разрядное -1.

Образец кода:

#include  int main(void) { long long x = 10; long long y = (0xffffffffL); long long z = (long)(0xffffffffL); printf("long long x == %lld\n", x); printf("long long y == %lld\n", y); printf("long long z == %lld\n", z); printf("0xffffffffL == %ld\n", 0xffffffffL); if (x > (long)(0xffffffffL)) printf("x > (long)(0xffffffffL)\n"); else printf("x  (0xffffffffL)) printf("x > (0xffffffffL)\n"); else printf("x <= (0xffffffffL)\n"); return 0; } 

Вывод (скомпилированный с GCC 4.5.3 на 32-разрядный Debian):

 long long x == 10 long long y == 4294967295 long long z == -1 0xffffffffL == -1 x > (long)(0xffffffffL) x <= (0xffffffffL) 

Это шестнадцатеричный литерал, поэтому его тип может быть неподписанным. Он вписывается в unsigned long , так что это тот тип, который он получает. См. Раздел 6.4.4.1 стандарта:

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

где список для шестнадцатеричных литералов с суффиксом L равен

  1. long
  2. unsigned long
  3. long long
  4. unsigned long long

Так как он не вписывается в 32-битный подписанный long , но беззнаковый 32-разрядный unsigned long , это то, чем он становится.

Дело в том, что правила определения типа интегрального литерала различаются в зависимости от того, есть ли у вас десятичное число или шестнадцатеричное число (или восьмеричное число). Десятичный литерал всегда подписывается, если postfixes с U. Шестнадцатеричный или восьмеричный литерал также может быть неподписанным, если подписанный тип не может содержать значение.