error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型
来源:互联网 发布:dnf软件限制策略优化 编辑:程序博客网 时间:2024/05/22 10:28
在学习有符号类型整数运算时,会遇到溢出的可能:
如下代码,tadd_ok函数能检测计算结果是否溢出
#include<iostream>using namespace std;//判断是否溢出,返回1则不溢出,0则溢出int tadd_ok(int x, int y){ int sum = x + y; if ((x > 0 && y > 0 && sum < 0) || (x < 0 && y < 0 && sum > 0)) return 0; //overflow else return 1; }int main(){ int x = 1073741824; int y = -2147483647 - 1; //int y = -2147483648 error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型 cout << "-y: " << -y << endl; //-y = -2147483648 cout << tadd_ok(x, -y) << endl; //1 cout << tadd_ok(x, y) << endl; //1 return 0;}
输出:
-y: -214748364811
有几点问题:
1、出现error C4146的情况:看上去用int y=-2147483647-1;
和用int y=-2147483648
一个意思,其实后者会出现错误。
原因在于 C的头文件limit.h中定义了int类型的最大值和最小值INT_MAX 和INT_MIN:
#define INT_MAX 2147483647#define INT_MIN (-INT_MAX - 1)
对于int y=-2147483648
,编译器会理解成对一个int值进行一元运算,显然已经溢出。
2、-y=-2147483648
,而不是2147483648,因为这超过了INT_MAX,机器码为0x80000000,所以仍然是-2147483648.
1 0
- error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型
- error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型
- VS2015中一元负运算符应用于无符号…
- 解决vs2013 error C4308: 负整型常量转换为无符号类型问题(转载)
- java中将有符号类型转换为无符号类型
- 给一个无符号数前置减号,结果仍为无符号
- 带符号类型和无符号类型
- 有符号类型和无符号类型
- 无符号类型的误导
- java不存在无符号类型
- 判断类型是无符号类型还是有符号类型
- 按位“或”运算符在带符号扩展操作数上使用;请考虑首先强制转换为较小的无符号类型
- 无符号类型和有符号类型的比较是个坑
- 有符号类型与无符号类型之间的转换
- 有符号类型自动转为无符号类型
- C++带符号类型和无符号类型
- C++中有符号类型与无符号类型对比
- 对无符号类型的建议
- Unity调用android的方法,android调用Unity的方法,unity和安卓的交互(2)2
- Byte、KB、B、MB、GB之间的关系
- C# 使用HttpWebRequest Post提交数据,携带Cookie和相关参数示例
- 深度学习Matlab工具箱代码注释——cnnsetup.m
- MultipartResolver实现文件上传
- error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型
- import static和import的区别
- Tpcc-MySQL测试与出图
- Swift3创建集合
- Android Native进程保活工程解析
- 选择显示安全选项卡
- compute manager(1) :init_host(self)(没写完)
- Java通过JNI调用C++
- 苏嵌单片机(二)