Столкнулся с интересным багом. После того как разобрался, что же именно происходит, меня постигло крайнее изумление! Оказывается, в языке Си тип числовой константы зависит от формата записи.
Дистиллированный пример кода, который это демонстрирует:
#include <stdbool.h>
#include <stdio.h>
#define IS_HEX(x) \
_Generic((x), \
unsigned int: true, \
long: false \
)
#define X 0x80000001
#define I 2147483649
int main(void) {
if(X == I)
puts("X == I");
if(!IS_HEX(I))
puts("I is not hexadecimal");
if(IS_HEX(X))
puts("X is hexadecimal");
return 0;
}
Все три сообщения будут выведены на экран.
Зачем это сделано? Кому от этого легче? Какие оптимизации это позволяет проворачивать, кроме оптимизации отстрела ног программистам? Непонятно! В общем, стремлюсь поделиться своим негодованием здесь и предостеречь будущие поколения от наступления на эти грабли.




