Интересный вопрос.
В соответствии с черновым стандартом C99 6.5.17.1 тип (0, s.f1)
совпадает с типом s.f1
, который (согласно 6.7.2.1.9) является "целочисленный тип без знака, состоящий из 1 бита ".Это арифметический тип в силу того, что он является целочисленным типом, его точность равна 1 (согласно 6.2.6.2.6, а в 6.2.6.1.3 нет битов заполнения), и, следовательно, его ранг меньше, чем int
(согласно второму пункту в пункте 6.3.1.1.1; int имеет точность не менее 15, поскольку он должен иметь возможность представлять значения в диапазоне от -32767 до 32767 (см. 5.2.4.2.1)).
Поскольку и x
, и выражение (0, s.f1)
имеют арифметический тип, выполняются обычные арифметические преобразования (согласно 6.5.8.3).Поскольку int может представлять полный диапазон значений s.f1
, ему присваивается значение (со знаком) int (согласно 6.3.1.1.2).Тогда, поскольку оба операнда являются (подписанными) целыми числами, общий действительный тип подписывается int (согласно 6.3.1.8), и поэтому результатом сравнения должно быть 0.