Учитывая этот фрагмент кода, зависит ли процессор на выходе или нет?

void main() {
 if(-1 > 0U)
 printf("True\n");
 else
 printf("False\n");
}

Является ли он зависящим от процессора (большой endian/little endian)?

2 ответа

От C99 6.3.1.8:

[...] В противном случае, если операнд с целым типом без знака имеет ранг, больший или равный рангам типа другого операнда, то операнд со знаком целочисленного типа преобразуется в тип операнда с беззнаковый целочисленный тип.

Поскольку int и unsigned int имеют одинаковый ранг конверсии (см. 6.3.1.1), -1 будет преобразован в unsigned int. Согласно 6.3.1.3, результат преобразования будет (-1 + UINT_MAX + 1) % (UINT_MAX + 1) (арифметически произнесенный), который, очевидно, UINT_MAX и, следовательно, больше, чем 0.

Вывод состоит в том, что для стандарта C требуется (-1 > 0U) true.


Кусок кода Endian-Dependent , только если он обращается к переменной x, используя указатель, тип которого меньше по размеру, чем тип x.

Например:

int x = 0x12345678;
char* p = (char*)&x;
char c = p[0]; // 0x12 on BE and 0x78 on LE

Обратите внимание на акцент на ", только если, в отличие от ", если и только если.

Следовательно, некоторые примеры могут по-прежнему работать одинаково для BE и LE:

struct s {int a; int b;} x = {0x11223344,0x55667788};
int* p = (int*)&x;
int i = p[0]; // 0x11223344 in both cases

Примечание:

Структуры битового поля могут быть скомпилированы по-разному для BE и для LE.

Но это можно назвать зависимостью от компилятора, а не архитектурной зависимостью.

licensed under cc by-sa 3.0 with attribution.