C++代码中long变量bin输出异常值与预期不符问题排查
整型变量输出与预期不符问题排查
你的代码存在3个直接导致bin变量输出异常的问题,逐个说明:
- 条件判断逻辑完全错误
- 首条判断
if (int(a) = 1)存在两个语法/逻辑错误:C++不支持直接将std::string类型强制转换为int得到字符串对应的数值,这个强转拿到的是无意义的内存垃圾值;其次此处使用了赋值运算符=而非相等比较运算符==,属于未定义行为。 - 后续两个分支
else if (a == 2)、else if (a == 3)是直接将字符串类型变量与整数常量比较,不存在合法的比较规则,永远无法匹配到对应分支。
三个赋值分支全部无法正确命中时,bin不会被赋予你预设的数值。
- 首条判断
- 数据类型溢出
多数编译环境(尤其是Windows平台)下long类型为4字节长度,可存储的最大正整数为2147483647,你预设的几个BIN值(如60457811425)远大于该上限,就算分支正确命中,赋值时也会发生整数溢出,数值被截断为类似3282692812的异常结果。 - 输出格式控制符生效范围错误
setw()、setfill()仅对紧随其后的第一个输出项生效,你当前的写法会导致月份、3位校验段的补0逻辑偶发失效。
修正后可运行代码
#include <iostream> #include <iomanip> #include <cstdlib> #include <ctime> using namespace std; int main() { // 直接用int类型接收菜单选项输入,避免类型转换错误 int a; int amount; cout << "1-10k 2-2k 3-1k: "; cin >> a; cout << "\n"; cout << "How many numbers do you want to be generated?: "; cin >> amount; cout << "\n"; // 用8字节长度的long long类型存储BIN,避免数值溢出 long long bin = 0; if (a == 1) { bin = 60457811425; } else if (a == 2) { bin = 60457811474; } else if (a == 3) { bin = 6045781165; } // 初始化随机数种子,否则每次运行生成的随机序列完全一致 srand((unsigned int)time(nullptr)); for (int i = 0; i < amount; i++) { cout << bin; // 输出6位随机后缀 for (int j = 0; j < 6; j++) { cout << rand() % 10; } cout << "|"; // 输出2位月份,不足位数补0 cout << setw(2) << setfill('0') << rand() % 12 + 1 << "|"; // 输出2022-2030区间的年份 cout << rand() % 9 + 2022 << "|"; // 输出3位校验段,不足位数补0 cout << setw(3) << setfill('0') << rand() % 1000 << "\n"; } system("pause"); return 0; }
内容的提问来源于stack exchange,提问作者Thraxx_7788
相关产品推荐
相关产品推荐

