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

 
В (1) случае нет Предупреждения, а во (2) и (3) есть:
void OnStart()
{
    int i = 1;
    ushort ch = USHORT_MAX;
    ch = ch + 1; //(1)
    ch = ch + i; //(2)//possible loss of data due to type conversion from 'int' to 'ushort'
    ch =      i; //(3)//possible loss of data due to type conversion from 'int' to 'ushort'
}

А какая принципиальная разница между ними?

 
A100 #:
В (1) случае нет Предупреждения, а во (2) и (3) есть:

А какая принципиальная разница между ними?

там-же написано...серым по белым насерато выбеленно - возможна потеря данных при конверсии из знакового int (32/64 бита от архитектуры) и беззнакового ushort (16 бит как правило)

разные размерности и знаковость

 
Maxim Kuznetsov #:

там-же написано...серым по белым насерато выбеленно - возможна потеря данных при конверсии из знакового int (32/64 бита от архитектуры) и беззнакового ushort (16 бит как правило)

разные размерности и знаковость

А в (1) случае почему тогда невозможна?

 
A100 #:

А в (1) случае почему тогда невозможна?

Инта нет. Юшот + юшот = юшот. Нет приведения типов.
 
Sergey Gridnev #:
Инта нет. Юшот + юшот = юшот. Нет приведения типов.

Если нет, то почему тогда:

void OnStart()
{
    ushort ch = 0;
    Print(typename(ch + 1));
}

Результат: int а не ushort ?

 
A100 #:

Если нет, то почему тогда:

Результат: int а не ushort ?

А это уже странно.
 
Sergey Gridnev #:
А это уже странно.

Напротив - все строго по Документации:

"Перед выполнением операций (кроме операций присваивания) происходит преобразование в тип, имеющий наибольший приоритет, а перед операциями присваивания - в целевой тип"

void OnStart()
{
    ushort ch = 0;
    Print(typename(ch + 1)); //int(ushort) + int
}
 
A100 #:

Все строго по документации:

"Перед выполнением операций (кроме операций присваивания) происходит преобразование в тип, имеющий наибольший приоритет, а перед операциями присваивания - в целевой тип"

Неужели такой сильнейший в пустоту расход вычислительных ресурсов в безобидной записи?

void OnStart()
{
  ushort ch = 0;
  
  ch = ch + 1; // ch = (ushort)((int)ch + 1); - Два преобразования.
  ch += 1;
  
  ch = ch + (ushort)1; // Ноль преобразований.
  ch += (ushort)1;
}


Такую хрень теперь писать, чтобы избегать ненужных вычислений?!

template <typename T>
void Inc( T &Value )
{
  Value += (T)1;
}
 
fxsaber #:

Неужели такой сильнейший в пустоту расход вычислительных ресурсов в безобидной записи?

Такую хрень теперь писать, чтобы избегать ненужных вычислений?!

Дополнительного расхода нет - потому что все все равно через int делается

void OnStart()
{
    short ch = 0;
    Print(typename(ch + ch));
}

Результат: int

Поэтому и предупреждения (2) выше были избыточны, и как Вы справедливо заметили - вместо простого кода приходится писать "хрень"

 
A100 #:

Поэтому и предупреждения выше были избыточны, и как Вы правильно заметили - вместо простого кода приходится писать "хрень"

К сожалению, не выйдет.

void OnStart()
{
  short ch = 5;
  
  Print(typename(ch + (short)1)); // int, похоже, и для ch+=1 будет преобразование.
  Print(typename(ch++)); // short
  
  // Никак не перевернуть знак без преобразования.
  Print(typename(-ch)); // int
  Print(typename((short)0 - ch)); // int
}
Возможно, typename формально все правильно выводит, а оптимизатор компилятора убирает эти пустые преобразования.