大整数值的定义
Definition of large integer value
我有一个项目,我处理不适合整数的大数(ns-时间戳)。因此,我想使用例如int64_t,并且正在编写一个测试用例(是的!)。
为了检查大数字的行为,我从
开始int64_t val = 2*std::numeric_limits<int>::max();
qDebug() << "long val" << val;
返回
long val -2
(就像我把val定义为int一样)。
但是如果我写
int64_t val = std::numeric_limits<int>::max();
val *= 2;
qDebug() << "long val" << val;
我得到
long val 4294967294
看起来是正确的。
所以对我来说,看起来好像2*max()
首先存储在一个整数中(在这一步中被截断),然后复制到int64
。为什么会发生这种情况?编译器知道结果是int64
类型,所以它应该直接适合2*max()
。
所以对我来说,看起来好像
2*max()
首先存储在一个整数中(在这一步中被截断),然后复制到int64
这绝对正确。根据语言规范,当表达式的所有部分都适合int
时,计算以整数形式完成。在您的示例中,2
和max()
都适合int
,因此乘法以整数进行,导致溢出。
编译器知道结果是
int64
类型,因此2*max()
应该直接适合。
在这种情况下,表达式的赋值结果并不重要:表达式本身指导计算的方式。您可以通过将max()
转换为int64
来获得相同的结果:
int64_t val = 2*(int64_t)std::numeric_limits<int>::max();
相关文章:
- 跟随整数索引列表的自定义类迭代器
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- 如何检查是否定义了固定宽度的整数
- 如何在不给它任何类型(如整数)的情况下定义某物?
- 从 C++ 中定义的异常返回整数
- 自定义哈希表实现-将字符串映射到整数时出现内存错误
- 定义整数之间的特殊划分
- 如何比较 #define 定义的字符串和整数
- 如何在C 中正确定义包含科学符号的整数矢量
- C++整数常量表达式定义
- 是否有一些有意义的统计数据来证明保持有符号整数算术溢出未定义是合理的
- 根据全局整数定义整数
- C++20 是否为"overflow"的有符号整数很好地定义了左移?
- C / C++中无符号整数的减法和比较是否定义良好?
- P1236R1:为什么 c++ 标准在定义整数时试图摆脱单词"bit"?
- 什么是快速整数?定义整数的速度
- 用整数填充自定义整数数组
- 如何在 C/C++ 中生成介于 0 和用户定义整数之间的随机数
- 如何在C++中创建自定义整数序列
- 操作符的算法重载-用于自定义整数类