C++中含无符号整数的表达式

C++中含无符号整数的表达式

如果表达式里既有带符号类型又有无符号类型,当带符号类型取值为负时会出现异常结果,这是因为i带符号数会自动地转换成无符号数。
因此,切勿将无符号数与有符号数混用
例如:

unsigned u = 10;
int i = -42;
std::cout << i + i << std::endl;    //输出-84
std::cout << u + i << std::endl;  //如果int占32位,输出4294967264
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现超过20位的无符号整数加法和乘法,我们可以使用字符串来存储这些数,然后实现对应的运算。具体实现如下: ```cpp #include <iostream> #include <fstream> #include <string> using namespace std; // 字符串逆序 void reverse(string& str) { int len = str.length(); for (int i = 0; i < len / 2; i++) { swap(str[i], str[len - i - 1]); } } // 无符号整数加法 string add(string a, string b) { int len_a = a.length(), len_b = b.length(); int len = max(len_a, len_b); string res(len, '0'); reverse(a); reverse(b); for (int i = 0; i < len; i++) { int sum = 0; if (i < len_a) { sum += a[i] - '0'; } if (i < len_b) { sum += b[i] - '0'; } sum += res[i] - '0'; res[i] = sum % 10 + '0'; if (sum >= 10) { res.push_back('1'); } } reverse(res); return res; } // 无符号整数乘法 string multiply(string a, string b) { int len_a = a.length(), len_b = b.length(); int len = len_a + len_b; string res(len, '0'); reverse(a); reverse(b); for (int i = 0; i < len_a; i++) { int carry = 0; for (int j = 0; j < len_b; j++) { int sum = (a[i] - '0') * (b[j] - '0') + (res[i + j] - '0') + carry; carry = sum / 10; res[i + j] = sum % 10 + '0'; } if (carry > 0) { res[i + len_b] += carry; } } reverse(res); int pos = res.find_first_not_of('0'); if (pos != string::npos) { return res.substr(pos); } return "0"; } int main() { ifstream fin("input.txt"); ofstream fout("output.txt"); if (!fin || !fout) { cout << "文件打开失败" << endl; return 0; } string a, b, op; while (fin >> a >> op >> b) { if (op == "+") { fout << add(a, b) << endl; } else if (op == "*") { fout << multiply(a, b) << endl; } } fin.close(); fout.close(); return 0; } ``` 在这个程序中,我们使用字符串来存储输入的两个数和运算符,然后判断运算符是加法还是乘法,并调用对应的函数来计算结果。在加法函数中,我们首先将两个字符串逆序,然后从低位到高位逐位相加,同时考虑到进位的情况。在乘法函数中,我们也是先将两个字符串逆序,然后使用一个双重循环来计算乘积,同时考虑到进位的情况。最后我们还需要处理一下乘积的前导零。 在读入文件和输出文件时,我们使用了 ifstream 和 ofstream 类来进行文件操作。在打开文件时,我们需要判断文件是否打开成功,如果失败则输出错误信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值