在Leetcode的Pow(x, n)中,有一组特殊的测试数据,即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                 intlong int            unsigned intlong long int       long intunsigned long intlong long intunsigned 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 类型,直到它可以完成正确的存放。

Why is 0 -0x80000000?相关推荐

  1. 00x80000000与0x80000000是32位有符号整型最小值的随记

    关于0<0x80000000与0x80000000是32位有符号整型最小值是否冲突作一点记录. 在C/C++中,0x80000000是32位有符号整型的最小值,32位有符号整型的范围是 -214 ...

  2. 估算带卷积核二分类0,3的网络的收敛时间和迭代次数

    制作一个网络分类minst的0和3求出这网络的迭代次数曲线表达式n(δ),和准确率表达式p-max(δ),用预期准确率去估算n,并推算需要的时间. 将minst的28*28的图片缩小到9*9,网络用一 ...

  3. UDT协议实现分析——连接的建立

    UDT Server在执行UDT::listen()之后,就可以接受其它节点的连接请求了.这里我们研究一下UDT连接建立的过程. 连接的发起 来看连接的发起方.如前面我们看到的那样,UDT Clien ...

  4. js怎么调用wasm_Long.js源码解析

    基于现在市面上到处都是 Vue/React 之类的源码分析文章实在是太多了.(虽然我也写过 Vite的源码解析 所以这次来写点不一样的.由于微信这边用的是 protobuf 来进行 rpc 调用.所以 ...

  5. Linux物理内存初始化

    背景 Read the fucking source code!  --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本 ...

  6. Linux Device Tree

     原创博文,转载请标明出处--周学伟  http://www.cnblogs.com/zxouxuewei/ 设备树使用手册 基本数据格式 设备树是一个包含节点和属性的简单树状结构.属性就是键-值对, ...

  7. c语言字符输出128,如何将128位整数转换为C中的十进制ASCII字符串?

    部门不是必需的: #include #include typedef unsigned long uint32; /* N[0] - contains least significant bits, ...

  8. 数字数据类型及其对应转移字符

    说明: 格式字符:c  输出一个字符. s 输出一个字符串. e 以指数形式输出实型数. f     以小数形式输出实型数. g 自动决定输出格式为e和f中较短的一种,不打印无效的零. % 输出%. ...

  9. Mit6.S081-xv6参考书翻译

    一.操作系统接口 介绍 操作系统的工作是为了多个程序共享一个计算机,并提供一个比硬件本身支持更有效的服务集. 一个操作系统管理.抽象低级硬件,例如:一个字处理器无需关心使用的是哪种类型的硬盘. 一个操 ...

最新文章

  1. 配置dialog无标题的几种方法
  2. Docker镜像仓库
  3. 【一步解决】eclipse jee左边的项目栏不见了
  4. 云原生时代,开发者如何构筑容器安全?
  5. Per-class allocator 2
  6. C++基础::关于区间端点的问题
  7. java实现端口扫描
  8. Docker for Mac配置阿里加速器
  9. 项目管理十大知识领域之项目资源管理
  10. DXGI抓屏优化扩展:GPU硬件编码保存文件即录像为MP4和FLV,外加麦克风+计算机声音
  11. 可视化实验五:大数据可视化工具—NodeXL
  12. 百度云盘Mac破解不限制下载速度-百度网盘客户端 - Go语言编写
  13. 疯狂模渲大师链接永久是最新版|怎么安装客户端并激活素材库联系作者加载自营专属素材扩展包高效使用超一流辅助插件脚本工具的步骤教程?...
  14. 原神换服报错(二级地址解析失败),换服失败,无反应
  15. php一句话上传webshell,一句话shell,哪些是恶意的php一句话webshell
  16. arcgis enterprise三维发布失败问题记录及解决办法汇总(后续会继续更新)
  17. 二级计算机等级证水平高吗,全国计算机水平一级高还是二级高
  18. 多项式拟合 java_最小二乘法多项式拟合的Java实现
  19. Appium-Screenshot(截图)
  20. Dubbo学习(一)

热门文章

  1. 【Golang 基础系列九】Go 语言的枚举
  2. SAS数据集的建立、存储、导出、导入和编辑
  3. nested exception is java.sql.SQLException: HOUR_OF_DAY: 0 -> 1
  4. java中是先学集合还是泛型_Java学习-在集合中使用泛型
  5. Openwrt DHCP服务设置其他IP做网关
  6. matlab newff,新版Matlab中神经网络训练函数Newff的使用方法.doc
  7. OPPO Ace2无法安装Charles证书
  8. 现代轻奢——看一眼就心动
  9. 编写脚本启动windows服务
  10. [pytest源码3]-pluggy代码结构与核心设计