为什么在C90 标准gt655下 2147483647>-2147483648 结果为假

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

首先这是针对int占4个字节的情况。
最高位是符号位1表示是负数,0表示是非负数
因為计算机是以补码的形式来存储数字的,不管-0还是+0补码都是00 0000,
这就造成了没有任何一个数的补码是00 0000所以就可以把这个补码用来存储一個数(不要浪费资源嘛),就规定用它来存储-(int_max+1)所以int最小值是-,即 00 0000

因此我们也发现, + 1会溢出变成-
加1之后补码就变成了:00 00


所以在int中用于正數表示的有31位能表示的数就是2^31 = 个
加上0之后的话,最大值就只能到

同理负数也有31位的空间去表示
只能表示这么多个数因为-0不需要表示,所以负数就多出一个数可以表示
就用这个多出来的表示-

所以java中int能表示的最大值就是


}

最近在编程中遇到一个问题:

 
 
使鼡VS2012编译提示:error C4146: 一元负运算符应用于无符号类型结果仍为无符号类型
 
在网上搜索,发现VS之前的版本提示的是warning而到了VS2012版本就直接提示为error,加强了严重性
实际上,当程序员尝试表达最小整数值 - 时会发生此问题。 该值不能写为 -因为表达式处理分两个步骤:

1. 计算数字 。 因 大於最大整数值 所以其类型不是 int,而是 unsigned int

 

2. 将一元负应用于该值,得到无符号结果(即还是无符号数)该结果碰巧是 。

 
而这种隐含转换的無符号类型的结果可能导致意外行为所以编译器会提示waring甚至在VS2012中直接提示error。

因为-会被转换为unsigned即同时在比较中1也会被提升为unsigned,从而得到結果0而这行代码我原意是比较两个int数,结果预计为1
如何避免出现编译器提示waring甚至是error?

1. 使用limits.h中宏定义的INT_MIN那为什么使用了该宏定义就不提示了呢?具体看其定义:

不是直接给出-的常量来避免;

2. 根据上述提示因而给int变量赋最小int值时,也可以使用 n = - - 1 或者你想特立独行的搞个 n = - - 2呮要不直接出现-就不会出现unsiged的转换。

 

发布了34 篇原创文章 · 获赞 21 · 访问量 4万+

}

我要回帖

更多关于 light标准 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信