"long long = int + int "先计算,然后类型转换?
"long long = int + int " first calculate ,then type conversion?
当我读取caspp时,有一个问题决定了是否可以在不溢出的情况下添加参数。因此,我编写以下代码。
//sum1 is long long ,so there is no overflow.
//when sum2 is overflow ,then sum1 != sum2;
int tadd_ok (int x,int y)
{
long long int sum1 = x + y;
int sum2 = x + y;
return sum1 == sum2;
}
然而,也存在一些问题。当我假设x=-2147483647,y=-2时,sum1和sum2都等于2147483747(都溢出!)。
我想,对于"long-long=int+int",首先计算,然后键入转换?那么这些规则是什么呢?
的主要目的
long long int sum1 = x + y;
是评估表达式CCD_ 1
请注意,;
是一个序列点,这意味着表达式的任何副作用都必须在到达该点时执行
这里的副作用是将表达式x + y
的值分配给sum1
ISO/IEC 9899:201x->6.3.1.8->1规定:
除非另有明确说明,否则常见的实数类型也是结果的相应实数类型
..
否则,将对两个操作数执行整数提升。然后以下规则应用于提升的操作数:
-如果两个操作数都具有相同的类型,则不需要进一步的转换
-否则,如果两个操作数都具有带符号整数类型或都具有无符号整数类型整数类型,具有较小整数转换秩类型的操作数为转换为具有更大秩的操作数的类型。
你想做的是
long long int sum1 = (long long int)x + y; // Casting x to LL causes y to be auto-converted
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 对 '(const Y) (int&, std::mersenne_twister_engine<long unsigned int,
- 自动类型默认为 int 而不是 long
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- Visual studio 2013 和 g++ 7.1 中将 int 和 long 类型相乘时的 c++ 差异行为
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 只读位置'__result.std::_Rb_tree_const_iterator<_Tp>::operator*<long long int>()'分配错误
- C++ vector::size_type:有符号与无符号;int vs. long
- 错误:将"long int (*)[4]"分配给"long int [4][4]"时的类型不兼容
- 没有匹配函数来调用"std::basic_ofstream<char>::write(std::string*, long long unsigned int)"
- 函数参数可以是char*、long或int.可能吗
- unsigned int/signed int/long-long:无法解释的输出
- 如何在C++中将二进制文件上下文转换为 int/long 值
- <int> <long> 当它们的大小相同时,将矢量转换为矢量?
- " long unsigned typedef int long ullong; "是什么意思?
- 我如何使用3个重载函数(参数的差异是int, long, float)同时只要求一个输入项
- 使用非固定整数(int, long)而不是固定大小的整数(int64_t, int32_t)有什么优势吗?