Why is 0 < -0x80000000?
2016-08-27 21:28
155 查看
在Leetcode的Pow(x, n)中,有一组特殊的测试数据,即
问题地址:Why is 0 < -0x80000000?
问:
条件
当我进行了修改
答:
这很难察觉。
每一个整数字面值在你的程序中都有一个类型。这些类型有如下标准,如表6.4.4.1:
如果一个数的字面值不能存放在默认的
尝试
如果不能存放,尝试
如果还不能存放,尝试
而十六进制的字面值的行为与上述过程大不相同。如果字面值不能存放在一个有符号类型如
所以在一个32位操作系统中,你的字面值是
这意味着你对它使用一元操作符
当你使用十进制形式将字面值替换为
1.0 -2147483648(求1.0^-2147483648)。同时我也发现Stack Overflow上一个与之类似的问题和答案。提问和回复都很精彩,就着手翻译一下(其实是为了加深记忆)。
问题地址:Why is 0 < -0x80000000?
问:
#include <stdio.h> #define INT32_MIN (-0x80000000) int main(void) { long long bal = 0; if(bal < INT32_MIN ) { printf("Failed!!!"); } else { printf("Success!!!"); } return 0; }
条件
if(bal < INT32_MIN)总是真,与我的预期不符。
当我进行了修改
#define INT32_MIN (-2147483648L)后,程序正常工作。
答:
这很难察觉。
每一个整数字面值在你的程序中都有一个类型。这些类型有如下标准,如表6.4.4.1:
Suffix Decimal Constant Octal or Hexadecimal Constant none int int long int unsigned int long long int long int unsigned long int long long int unsigned long long int
如果一个数的字面值不能存放在默认的
int类型中,它将试图采用下一个类型(如表6.4.4.1)所示。所以对于十进制整数字面值,将进行如下过程:
尝试
int
如果不能存放,尝试
long
如果还不能存放,尝试
long long
而十六进制的字面值的行为与上述过程大不相同。如果字面值不能存放在一个有符号类型如
int中,在它提升类型前会首先将尝试存放在
unsigned int。我们可以从表6.4.4.1中看出其中的差异。
所以在一个32位操作系统中,你的字面值是
0x80000000是一个
unsigned int类型。
这意味着你对它使用一元操作符
-将不能达到相应的效果( 一元负运算符应用于无符号类型,结果仍为无符号类型)。另一种情况是它会造成一个有符号整数的溢出。相反的,你将得到值
0x80000000,一个正值。
bal < INT32_MIN将执行常见的算数类型转换,表达式中的
0x80000000将从
unsigned int转换为
long long类型存放,0小于
0x80000000,因此产生了如此结果。
当你使用十进制形式将字面值替换为
2147483648L后,编译器将不再选择
unsigned int, 而是尝试将它存放在一个
long类型中。还有后缀
L意味着如果可能的话,你想用一个
long类型来进行存放。后缀
L通常遵守相同的规则(如表6.4.4.1):如果这个数不能存放在它所请求的
long类型中,编译器将会给你一个
long long类型,直到它可以完成正确的存放。
相关文章推荐
- Windows Phone 7 IEnumerable<T>.Select和SelectMany的区别
- <<java面试宝典>>学习笔记
- List<T> 查找、删除
- 数据库基础<四>触发器
- struts2 <s:textfield> value属性默认值解决方案
- weblogic启动报<BEA-090782>错误
- Can not find a java.io.InputStream with the name [inputStream] in the invocation stack. Check the <p
- c++中#include<>中都能加什么?有什么用?
- xcode编译错误"std::__1::__vector_base_common<true>::__throw_length_error() const"
- web.xml is missing and <failOnMissingWebXml> is set to true解决方法
- php文件里直接写上<?xml version="1.0" encoding="utf-8"?>出错?
- C# List<T>用法
- All about <httpRuntime targetFramework>
- Redis常用命令速查 <第二篇>
- 读<专栏·谈谈全栈工程师>
- for(i=0,j=0;i<10,j<10;i++,j++)用python怎么写
- Hibernate逍遥游记-第13章 映射实体关联关系-005双向多对多(使用组件类集合\<composite-element>\)
- <welcome-file>index.action</welcome-file>直接设置action,404和struts2中的解决方案()
- template<typename Y>用两个queue实现stack
- 【mybatis】<![CDATA[]]>使用方法