error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型

转载 2017年01月03日 08:28:28


这个错误涉及到一点编译时自动类型转换的知识,一段触发代码(取消第二行的注释):

#include <iostream>
#include <bitset>
using namespace std;
 
///////////////////////////SubMain//////////////////////////////////
int main(int argc, char *argv[])
{
	cout << "int 最小值: " << INT_MIN << endl;
	//int n = -2147483648; // 错误	1	error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型
	int i = 128;
	cout << "int" << endl;
	cout << '+' << i << " : ";
	cout << bitset<32>(i) << endl;
	cout << -i << " : ";
	cout << bitset<32>(-i) << endl;
	cout << endl;
	unsigned int ui = 2147483648;
	
	cout << "unsigned int" << endl;
	cout << "+" << ui << " : ";
	cout << bitset<32>(ui) << endl;
	
	system("pause");
	return 0;
}
///////////////////////////End Sub//////////////////////////////////

输出:

int 最小值: -2147483648
int
+128 : 00000000000000000000000010000000
-128 : 11111111111111111111111110000000
 
unsigned int
+2147483648 : 10000000000000000000000000000000
请按任意键继续. . .


虽然明明 int 最小值是 -2147483648,但我们就是无法用int n = -2147483648;表示。

编译器(VS2013)在看到int n = -2147483648;的时候,首先判断2147483648 > INT_MAX,知道int装不下,于是决定使用 unsigned int。然后发现前面还有个负号,于是对2147483648取反,也就是说这句话在编译器看来等效于:

unsigned int temp = 2147483648;
temp = - temp;
int n = temp;

然而取反操作实际上是将从高位到第一个1之间的位取反,+2147483648 : 10000000000000000000000000000000取反后依然是它本身。某些编译器会允许上面三句话执行,最终结果n = 2147483648,显然造成隐患,而编译器只不过抛出一个warning而已。到了VS2013这种代码直接被判定为error,这才是合理的表现。

如果我们希望解决这个问题的话,必须使用int n = INT_MIN;来表示,其中INT_MIN的定义:

#define INT_MIN     (-2147483647 - 1) /* minimum (signed) int value */


转载须注明:码农场 » error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型


相关文章推荐

解决vs2013 error C4308: 负整型常量转换为无符号类型问题(转载)

转自:http://blog.csdn.net/angle635/article/details/22035427 前面在学习使用google的protobuf时在VS2012中一直...
  • bodybo
  • bodybo
  • 2015年03月31日 18:59
  • 2583

[集合]c/c++常见编译错误

原文地址:http://blog.csdn.net/angle635/article/details/22035427 前面在学习使用google的protobuf时在VS2012中一直无法编译编译...

error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型

在学习有符号类型整数运算时,会遇到溢出的可能: 如下代码,tadd_ok函数能检测计算结果是否溢出#include using namespace std; //判断是否溢出,返回1则不溢出,0则溢...
  • Mind_V
  • Mind_V
  • 2017年05月08日 17:30
  • 667

含有无符号类型的表达式计算

当一个算术表达式中既有无符号数又有有符号数值时,有符号数的值就会转换成无符号数。例如:unsigned u = 10; int i = -42; cout...

Java无符号数据类型

Java不支持无符号数据类型。byte,short,int和long都是有符号数据类型。对于有符号数据类型,值范围的一半存储正数,一半用于负数,因为一个位用于存储有符号值的符号。 例如,一个字节...
  • ilvest
  • ilvest
  • 2017年03月22日 09:31
  • 129

java中无符号类型的解决方案

在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换。 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stre...

java中无符号类型处理(转载从网络)

在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换。 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对S...

Java之 无符号类型是怎么回事

原文地址:http://www.darksleep.com/player/JavaAndUnsignedTypes.html 原文作者:Sean R. Owens 以下是正文 J...
  • lqhed
  • lqhed
  • 2016年09月27日 21:32
  • 482

STM32串口通信代码、ASCII码、XU4串口通信,printf只会转换为无符号类型,linux下的串口通信程序

1、其里面的的通信协议是是自己定的,这里 是检测到数据的结尾是以0x0d、0x0a结尾,则表示接受的数据完成了,这个数据是我想要的,这样子就不会出现一些错乱的数据信息。其中的0x8000、0x4000...

编一个程序,完成64位数据(无符号)的加法、减法运算。不允许直接使用64位的数据类型。(未完成)

#include #include typedef struct Num_64{long low;long high;}Num_64;Num_64 Add_64(Num_64 a, Num_64 b)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型
举报原因:
原因补充:

(最多只允许输入30个字)