两个 UShorts 之间的操作在 VC2015 中给出了一个 int

Operation between two UShorts gives an int in VC2015?

本文关键字:int 一个 之间 UShorts 操作 VC2015 两个      更新时间:2023-10-16

以下代码在使用Visual Studio 2015编译时给出错误error C2397: conversion from 'int' to 'ushort' requires a narrowing conversion

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 节整型类型(Word 文档第 80 页左右)。在这里你会发现:

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

溶液:

使用int, uint, long, ulong

相关文章: