0

以下代码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在一种情况下返回 a ushort,在另一种情况下返回 a 。

我无法理解这一点。
你能解释一下这里发生了什么吗?


PS:确切的编译器版本:Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86

4

1 回答 1

-2

在对 ushort 进行算术运算的情况下,操作数被转换为可以保存所有值的类型。这样就可以避免溢出。操作数可以按 int、uint、long 和 ulong 的顺序变化。请参阅本文档中的C# 语言规范,转到第 4.1.5 节整数类型(word 文档中的第 80 页左右)。在这里你会发现:

对于二进制 +、–、*、/、%、&、^、|、==、!=、>、<、>= 和 <= 运算符,操作数转换为 T 类型,其中 T 是第一个int、uint、long 和 ulong 可以完全表示两个操作数的所有可能值。然后使用类型 T 的精度执行操作,结果的类型是 T(或关系运算符的 bool)。对于二元运算符,不允许一个操作数为 long 类型而另一个为 ulong 类型。

解决方案:

利用int, uint, long, ulong

于 2017-02-01T11:01:28.953 回答