如果我将 int 设置为等于 2 个最大整数的总和会发生什么
What happens if I set an int equal to the sum of the 2 largest ints?
int sum;
int N 表示的最大数是 2^0 + 2^1 + ... + 2^(sizeof(int)*8-1)。如果我设置 sum = N + N 会发生什么?我对编程有点陌生,只是让你新来。
如果int
加法的结果超出了可以用int
表示的值范围(INT_MIN
.. INT_MAX
),您有一个溢出。
对于有符号整数类型,整数溢出的行为是未定义的。
在许多实现中,你通常会得到一个结果,它与忽略数学结果中除低阶N位之外的所有位(其中N是int
中的位数)一致 - 但语言不能保证这一点。
此外,允许编译器假定代码的行为已定义,并基于该假设执行优化。
例如,在 clang++ 3.0 中,这个程序:
#include <climits>
#include <iostream>
int max() { return INT_MAX; }
int main()
{
int x = max();
int y = x + 1;
if (x < y) {
std::cout << x << " < " << y << "n";
}
}
使用 -O0
编译时不打印任何内容,但打印
2147483647 < -2147483648
使用 -O1
或更高版本编译时。
总结:不要那样做。
(顺便说一下,类型 int
的最大可表示值更简单地表示为 2 N-1-1,其中 N 是以 int
类型的位为单位的宽度- 或者更简单地说是 INT_MAX
。对于具有 32 位int
的典型系统,即 231-1 或 2147483647
。您还假设sizeof
以 8 位为单位;事实上,它以 CHAR_BIT
位为单位,其中CHAR_BIT
至少为 8,但(很少)可以更大。
您将有一个整数溢出,因为该数字对于int
来说太大了,如果要执行此操作,则必须将其声明为long
希望这有帮助
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 将一系列整数放入类的最佳方法是什么?
- 什么是自动 t1=std::make_tuple(case1==case2,整数)的值
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- int8_t和uint8_t真的是整数吗?它们有什么用?
- 比较C++中两个整数的最有效和最干净的方法是什么?
- 为什么此指针值不能转换为整数的规则是什么?
- 为对象分配整数.输出将是什么?
- 我正在尝试制作一个程序,在添加 n 天(整数)后告诉一个人什么是一天(例如星期一等)
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 什么是 16 字节有符号整数数据类型?
- 计算机使用什么方法添加无符号整数
- " ans += (a[i] - ans * r > 0); "是什么意思,其中 ans,r 是整数,a[i] 是数组元素?
- 有什么区别 - 常量 int x = 5000;和常量整数 x = 50'00;在C++?
- 将大小转换为整数有什么问题?
- 在函数声明之后声明整数有什么用?