2017-02-01 1 views
0

次のコードは、2015年2つのUShorts間の操作はVC2015にintを与えますか? Visual Studioにコンパイルした場合

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は1ケースでint、別でushortを返すように見えるエラーerror C2397: conversion from 'int' to 'ushort' requires a narrowing conversionを与えます。

私はこれを理解できません。
ここで何が起こっているのか説明できますか?


PS:正確なコンパイラのバージョンは:Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86

答えて

-2

USHORTに算術演算の場合、オペランドは、すべての値を保持することができる型に変換されます。オーバーフローを避けることができます。オペランドはint、uint、long、およびulongの順に変更できます。 C# Language Specificationを参照してください。このドキュメントでは、「4.1.5整数型」(「ドキュメント」の80ページ目)に進みます。ここでは見つける:+、バイナリについては

- 、*、/、%、&、^、|> =、および< =演算子、オペランド、、==、=、>、<!タイプTに変換されます.Tは、両方のオペランドのすべての可能な値を完全に表すint、uint、long、およびulongの最初のものです。次に、操作はタイプTの精度を使用して実行され、結果のタイプはT(または関係演算子の場合はbool)です。あるオペランドがlong型であり、もう一方のオペランドがulong型であることは二項演算子では許されません。

ソリューション:

使用int, uint, long, ulong

+0

なぜこの質問に関連するC#はありますか? – GetFree

関連する問題