Ошибки, баги, вопросы - страница 1127

 
Fleder:

А что даёт эта перестановка? t как была меньше, чем ULONG_MAX-1, так и осталась.

Это я неправильный пример привел - там было сравнение с int, а здесь с long

for(int t=0
void OnStart()
{
  long t=0;
 

Приоритет  типов uint и ulong выше, чем у int и long:

Преобразования при объединении бинарной операцией 

Логично было бы в сравниваемых выражениях использовать преобразование к старшему типу.

Но похоже, что это не относится к  проверяемым выражениям циклов.

 
ULONG_MAX не имеет типа как такового, в сравнении с int он будет - int, в сравнении с long - long
 
A100:
ULONG_MAX не имеет типа как такового
А какой тип имеет это число: 18446744073709551615?
 
A100:
ULONG_MAX не имеет типа как такового, в сравнении с int он будет - int, в сравнении с long - long

А в сравнении с ulong?

void OnStart()
{
  ulong n=18446744073709551615;
  Print(ULONG_MAX==n);   //true
}
 
A100:
ULONG_MAX не имеет типа как такового, в сравнении с int он будет - int, в сравнении с long - long

А может быть наоборот?

int и long в сравнении с ulong будут ulong?

 
Fleder:

А может быть наоборот?

int и long в сравнении с ulong будут ulong?

Когда сравниваются знаковые и беззнаковые, то выдается предупреждение, если явно не преобразовать одно к другому, то наверное будет побитовое сравнение
 

Похоже, что в циклах действительно происходит преобразование к знаковому типу:

void OnStart()
{
  ulong n=0;
  for(ulong i=0;i<ULONG_MAX;i++) {n++;}
  Print("n = ",n);          //0
  Print((long)ULONG_MAX);   //-1
}

 И ни одна итерация не выполняется.

 
A100:
Когда сравниваются знаковые и беззнаковые, то выдается предупреждение, если явно не преобразовать одно к другому, то наверное будет побитовое сравнение
void OnStart()
{
  long l=13;
  ulong u=13;
  bool compare=(l==u);           //предупреждения нет
  Print("compare = ",compare);   //compare = true
}

 
bool f( int i, uint j )
{
        return ( i < j );
}
а так - есть
Причина обращения: