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: 一元负运算符应用于无符号类型,结果仍为无符号类型


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

原文地址:http://blog.csdn.net/angle635/article/details/22035427 前面在学习使用google的protobuf时在VS2012中一直无法编译编译...
  • xian_wwq
  • xian_wwq
  • 2015年08月03日 09:44
  • 2422

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

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

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

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

int类型赋值INT_MIN(-2147483648)

最近在编程中遇到一个问题: error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型...
  • MrKnight
  • MrKnight
  • 2013年08月09日 15:19
  • 2831

VS2015中一元负运算符应用于无符号…

在使用VS2015编写程序时候遇到这样的问题,一样的代码在LINUX下却没有任何问题能够正常的编译 原因: 这一问题是由于编译器SDL安全检查认为这一操作(通常是为无符号整形取负的操作)无效而产...
  • u012388993
  • u012388993
  • 2017年03月08日 11:00
  • 249

C++中new一个动态数组(内置类型和自定义类型的区别)

在学习数据结构与算法的时候,T *p = new T[n]的算法复杂度为Θ(n),而int *p = new int[n]的算法复杂度为Θ(1)。 C++ primer的动态内存的讲解没有关于这一点...
  • Mind_V
  • Mind_V
  • 2017年04月25日 15:41
  • 1241

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

这个错误涉及到一点编译时自动类型转换的知识,一段触发代码(取消第二行的注释): #include #include using namespace std; /////////////////////...
  • liuhhaiffeng
  • liuhhaiffeng
  • 2017年01月03日 08:28
  • 1257

无符号整型赋值陷阱

有没有人尝试过将负数赋给一个无符号整型变量?知不知道这样做会发生什么?还没有尝试的就让我们来探索下无符号整型隐藏的秘密。 先来看看下面代码: int main() {       un...
  • liuy88141
  • liuy88141
  • 2015年05月25日 13:53
  • 318

C++带符号类型和无符号类型

 带符号类型表示正数或负数(包括0),而无符号类型只能表示大于或等于0.  按照概念推理,说明int类型是无符号,写成unsigend int 表示我建立的这个int类型只能表示大于或等于0的数...
  • luo809976897
  • luo809976897
  • 2016年03月02日 16:23
  • 218

C++ 中有符号类型到无符号类型的转换

为了更好地解释下面的代码,先来介绍一些背景知识,在我的计算机中, char 类型占 8 个比特位,那么, unsigned char 类型能表示的数的范围为 0 ~ 2的8次方 - 1,即 0 ~ ...
  • gcvdsvb
  • gcvdsvb
  • 2014年03月06日 21:54
  • 1820
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型
举报原因:
原因补充:

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