Операция между двумя UShorts дает int в VC2015?

Следующий код дает ошибку 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

0

Решение

В случае арифметических операций над 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

-2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]