Следующий код дает ошибку error C2397: conversion from 'int' to 'ushort' requires a narrowing conversion
при компиляции с Visual Studio 2015.
typedef unsigned short ushort ;
struct MyStruct{ ushort a ;} ;
MyStruct func(){
ushort a = 1, b = 1 ;
ushort c = a | b ; // <--- No error here
//return {c} ; // <--- Compiles fine
return {a | b} ; // <--- Error in this line
}
int main(){
ushort a = func().a ;
}
Выражение a | b
кажется, возвращает int
в одном случае и ushort
в другой.
Я не могу понять это.
Можете ли вы объяснить, что здесь происходит?
PS: Точная версия компилятора: Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86
В случае арифметических операций над ushort операнды преобразуются в тип, который может содержать все значения. Так что этого переполнения можно избежать. Операнды могут меняться в порядке int, uint, long и ulong. Пожалуйста, смотрите Спецификация языка C # В этом документе перейдите к разделу 4.1.5 Интегральные типы (около стр. 80 в текстовом документе). Здесь вы найдете:
Для двоичного +, -, *, /,%, &, ^, |, ==,! =,>, <> = и <= операторы, операнды преобразуются в тип T, где T — это первое из int, uint, long и ulong, которое может полностью представлять все возможные значения обоих операндов. Затем операция выполняется с использованием точности типа T, а тип результата — T (или bool для реляционных операторов). Не допускается, чтобы один операнд имел тип long, а другой — тип ulong с бинарными операторами.
Решение:
использование int, uint, long, ulong
Других решений пока нет …