整数不会重复超过随机数
An integer won't double past a random number
我最近开始学习C++,并制作了这个小程序
#include <iostream> // for std::cout << / std::cin >> / std::endl; / 'n'
#include <cstdlib> // for EXIT_SUCCESS and EXIT_FAILURE
int input()
{
int imp_num{ 0 };
std::cin >> imp_num;
return imp_num;
}
void output(int result)
{
std::cout << "The dubble of that number is : " << result << 'n';
}
int main()
{
std::cout << "Enter a number: ";
int inp_num{ input() }; // asks the user to enter a number and saves it
int result{ inp_num * 2 }; // calculates the result
output(result); // outputs the result
system("pause"); //prevents the console from terminating
return 0;
}
当恢复的数字是10位或更多时,就会出现问题。在这一点上,程序只是一个随机数(通常是-2(,无论我放什么,它都将始终保持不变,并且只有在重新编译源代码时才会更改。
Enter a number: 23213231231231212312
The dubble of that number is : -2
Press any key to continue . . .
Enter a number: 12311111111111111111111111
The dubble of that number is : -2
Press any key to continue . . .
我重新编译源代码
Enter a number: 1231212123133333333333321
The dubble of that number is : 3259
Press any key to continue . . .
将所有的int
更改为int64_t
并不能解决问题,但奇怪的是,这里出现了相同的-2输出。
Enter a number: 1231212123133333333333321
The dubble of that number is : -2
Press any key to continue . . .
我不明白,如果发生整数溢出,为什么所有的数字中都会出现-2。我觉得数字应该绕一圈。
您给出的值1231212123133333333321远远大于uint64_t
所能容纳的值(溢出(。在我的例子中,uint64_t
(占用8字节数据(数据类型的最大范围是:
0 to +18446744073709551615
要了解平台中的限制,即实际操作,请借助C++库limits
:
#include <limits>
std::cout << std::numeric_limits<uint64_t>::max() << std::endl;
请注意,不同的计算机体系结构可能会有所不同。
int
是一个有符号(通常为32位(数字,它只能容纳-2147483648到2147483647之间的数字。当您试图输入这么大的数字时,std::cin
无法做到这一点,而是设置了可能的最大值。
现在,您正试图将要保持的最大值乘以2,这会导致溢出和UB,从技术上讲,任何事情都可能发生在您的代码中,但您使用的编译器似乎发生了以下情况。
int
是2补码,这意味着最大值具有以下比特表示。
01111111111111111111111111111111111,或十六进制中的0x7fffffff
当你试图乘以2时,你做的是左1位,你得到了
1111111111111111111111111111111111 0或表示-2的0xfffffffe。
请记住,即使您现在使用的编译器和标志/优化发生了这种情况,使用不同的编译器和标记也会产生不同的结果,因为您会导致"未定义行为"。
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 创建整数的 2D 数组,该数组将使用两个函数用随机数填充矩阵.我做错了什么?
- C++:随机数列表:x 个随机整数
- C++任意整数(基本类型)的随机数
- 浮点数或整数范围内的随机数
- 使用 WELL512 的两个整数之间的 C++ 随机数
- 如何在 C/C++ 中生成介于 0 和用户定义整数之间的随机数
- 从整数列表中选择一个随机数
- 试图生成整数的随机数组,每次运行得到相同的列表.c++
- C++ 获取从 0 到最大长整数的随机数