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

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 );
}
а так - есть

В "обычных" сравнениях приводится к беззнаковому типу:

void OnStart()
{
  ulong i=0;
  while(true)
  {
    if(i<ULONG_MAX) {i++;}  //тут в условии так и остаётся тип ulong, преобразования к long не происходит
    else {break;}
  }
}
Fleder:

 Тогда как объяснить это:  

long t=0;
  bool comp=(ULONG_MAX-1>t);
  Print("comp = ",comp);   //comp = true
Побитовое сравнение - нет противоречия. А потом - сравнивать ulong и long некорректно только если long < 0