Информация об изменениях

Сообщение Re[3]: char, signed char, unsigned char от 21.02.2017 16:44

Изменено 21.02.2017 19:21 N. I.

Re[3]: char, signed char, unsigned char
rg45:

R>Вот как раз C, в отличие от C++, не требует чтобы char был отдельным типом:


Всё ж-таки требует, но через одно место:

The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char. [Footnote: CHAR_MIN, defined in <limits.h>, will have one of the values 0 or SCHAR_MIN, and this can be used to distinguish the two options. Irrespective of the choice made, char is a separate type from the other two and is not compatible with either.]


Размещение такого уточнения в сноске похоже на нарушение регламента составления стандартов (если только из нормативной части не следует, что данные типы — непременно разные), но это обстоятельство вряд ли заставит кого-то трактовать стандарт C иначе.

Как следствие, вот такие варианты

    char *p1 = 0;
    signed char *p2 = 0;
    int d = p2 - p1;

    char *p1 = 0;
    unsigned char *p2 = 0;
    int d = p2 - p1;

по-любому являются ошибочными и для обоих требуется выдача компилятором какого-нибудь diagnostic message из-за нарушения constraints.
Re[3]: char, signed char, unsigned char
rg45:

R>Вот как раз C, в отличие от C++, не требует чтобы char был отдельным типом:


Всё ж-таки требует, но через одно место:

The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char. [Footnote: CHAR_MIN, defined in <limits.h>, will have one of the values 0 or SCHAR_MIN, and this can be used to distinguish the two options. Irrespective of the choice made, char is a separate type from the other two and is not compatible with either.]


Размещение такого уточнения в сноске похоже на нарушение регламента составления стандартов (если только из нормативной части не следует, что данные типы — непременно разные), но это обстоятельство вряд ли заставит кого-то трактовать стандарт C иначе.

Как следствие, вот такие варианты

ptrdiff_t char_ptr_diff(char *p1, signed char *p2)
{
    return p1 - p2;
}

ptrdiff_t char_ptr_diff(char *p1, unsigned char *p2)
{
    return p1 - p2;
}

по-любому являются ошибочными и для обоих требуется выдача компилятором какого-нибудь diagnostic message из-за нарушения constraints.