【译】为什么这样宏定义#define INT_MIN (-2147483647 - 1)?

2的32次方为2147483648*2,0~(2147483648*2-1)这是32位机上无符号整数代表的范围。而32机的int范围为-2147483648~+2147483647

stackoverflow.com上有人提出这样一个问题:

if (-2147483648 > 0)
    std::cout << "true";
else
    std::cout << "false";

这将输出true,
而下面的程序会输出false:

if (int(-2147483648) > 0)
    std::cout << "true";
else
    std::cout << "false";

下面是对排名第一答案的翻译:

-2147483648不是一个“数”。实际上,-2147483648是一个表达式:一个正整数2147483648和一个一维运算符“-”。对于32位机,2147483648明显已经超过了int的范围。如果long int有“更大的范围”,编译器会自动的假定2147483648为long int型。(C++11的编译器会假定为long long int型)。这样才会得到用户想要的“负的2147483648”

然而很明显,如果long int和int一样,就不会存在“更大的范围”了。这样的话,2147483648溢出了,你的程序的行为是未定义的。

所以,通常我们这样定义

#define INT_MIN (-2147483647 - 1)

而不是,看似更直接的定义

#define INT_MIN -2147483648

后者可能造成意想不到的结果

原文地址:http://stackoverflow.com/questions/14695118/2147483648-0-returns-true-in-c#

时间: 2024-08-13 18:10:38

【译】为什么这样宏定义#define INT_MIN (-2147483647 - 1)?的相关文章

&lt;转&gt;Verilog HDL宏定义define

宏定义 `define 用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为: `define 标识符(宏名) 字符串(宏内容) 如:`define signal string 它的作用是指定用标识符signal来代替string这个字符串,在编译预处理时,把程序中在该命令以后所有的signal都替换成string.这种方法使用户能以一个简单的名字代替一个长的字符串,也可以用一个有含义的名字来代替没有含义的数字和符号,因此把这个标识符(名字)称为“宏名”,在编译预处理时将宏名替换成字符串

iOS之宏定义#define

最基本的宏定义用法 #define aaa  bbb 表示用aaa替换bbb的内容. 宏作用范围 宏的作用范围是在当前文件内, 如果需要作用于其他类(如在类b调用类a已定义宏),那么需要在类b引入类a的头文件(a.h). 如果需要作用于整个工程,可以定义一个类如Config.h,在该类定义好需要的宏,然后在工程的XXX_Prefix.pch文件 #import "Config.h" 在Config.h中 #define aaa  bbb 在XXX_Prefix.pch文件 中 #ifd

宏定义 #define 和常量 const 的区别

宏定义 #define 和常量 const 的区别 类型和安全检查不同 宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误: const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查 编译器处理不同 宏定义是一个"编译时"概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束与编译时期: const常量是一个"运行时"概念,在程序运行使用,类似于一个只读行数据 存储方式不同 宏定义是直接替换,不会分配内存,存储与

C语言宏定义#define用法

#define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处产生一些困惑,在编程时误用该命令,使得程序的运行与预期的目的不一致,或者在读别人写的程序时,把运行结果理解错误,这对 C语言的学习很不利.1 #define命令剖析1.1   #define的概念#define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本.

高大上的宏定义#define

宏定义在很多语言里面都可以看到它的影子,C# ,C++,C等,尤其是系统API里面很多宏定义,看着很唬人.合理的利用宏定义,可以让自己的代码看着更规范,更方便,尤其在特定的某些地方.使用宏定义还可以让自己的代码看着高大上有木有! 本文改引自http://www.cnblogs.com/ios8/p/ios-hong.html 网上对IOS的宏定义比较多,我总结了一些最常用的宏,后续还会继续补上. 1.首次启动判断: #define First_Launched @"firstLaunch&quo

C语言 预处理二(宏定义--#define)

//#define 宏定义(宏定义一般大写) //知识点一-->#define的作用域:从#define开始,从上往下,如果遇到#undef就到#undef处结束,如果没有就是作用于当前整个文件 #include<stdio.h> #include<stdlib.h> //知识点二-->宏定义作用 //宏定义作用1:起到替换作用,可以定义常量 #define X 10 //宏定义作用2:替换代码的任意部分(一般用于易语言,或者加密代码) #define 水乃万物之源 m

[转]c语言宏定义#define的理解与资料整理

原文地址:http://www.cnblogs.com/haore147/p/3646934.html 1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认识这个宏了:也可以把任何东西定义成宏.因为编译器会在预编译的时候用真身替换替身,而在我们的代码里面却又用常常用替身来帮忙. 看例子: 1 #define PI 3.141592654 在此后的代码

宏定义#define的用法

预处理#define定义函数 #include <stdio.h> #define Connect(x,y) x##y //"##"表示连接x与y int main(void) { int n = Connect(123,456); printf("n=%d\n",n); return 0; }

宏定义#define

#include<stdio.h> #define exchange(a,b){\int t;\t=a;\a=b;\b=t;\}int main(int arge,char *argv){ int a=2,b=3; printf("交换前a=%d,b=%d",a,b); exchange(a,b); printf("交换后a=%d,b=%d",a,b); return 0;}