两个 UShorts 之间的操作在 VC2015 中给出了一个 int
Operation between two UShorts gives an int in VC2015?
以下代码在使用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
相关文章:
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 包装一个对象并假装它是一个 int
- cin >> int 给定一个字符串将 int 赋值为 0
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- 我从int x[3]得到的一个非常奇怪的输出;
- 在 C++11 中利用 int*_t、int_fast*_t 和 int_least*_t 之间的差异的一个很好的例子是
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- c++:如何打印出一个强制转换的 int 值?
- 通过将其中一个模板更改为 muliset 后,我可以在 PBDS 排序集上使用计数功能<int>less_equal<int>
- 查找不在标准中的第一个值::设置<int>最小-最大值
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 超过CPU时间限制:当MPI_Sent一个非常大的int*时
- 使用无符号int作为二进制来在c++中实现一个集
- 如何声明一个必须在C++中同时存储int和char值的2D数组
- 在int main()[c++]中实现一个递归函数
- 错误:"int pow(double,int)"与上一个声明int pov(double a,int
- CStringArray::GetAt(int index) 返回一个 const. 为什么?
- 打印一个带有静态 int 的函数,有一个 std::cout 和多个 std::cout 有什么区别?
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*