#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX-1)

在阅读csapp这本书时,我发现作者提出了这个问题,但我不明白为什么要这样定义它.直接用-2147483647来定义它有什么区别?

推荐答案

#include <stdio.h>

int main() {
    printf("%d, %zu\n",-2147483647-1,  sizeof(-2147483647-1)); 
    printf("%d, %zu\n",(int)-2147483648, sizeof(-2147483648)); 
    return 0;
}

输出:

-2147483648, 4
-2147483648, 8

该标准说:

整数常量以数字开头,但没有句点或指数部分.它可以具有指定其基址的前缀和指定其类型的后缀.

请注意,-不是常量的一部分.它是在解释常量之后应用的求反运算符.

因此,对于-2147483648,编译器将使用2147483648部分来确定其类型.为此,该标准规定:

The type of an integer constant is the first of the corresponding list in which its value can be represented.

因为没有后缀指定它的类型,并且2147483648不能由int表示(因为int_Max是2147483647),所以它的类型将是long int,然后sizeof INT_MIN将是8,这是错误的.

C++相关问答推荐

字符数组,字符指针,在一种情况下工作,但在另一种情况下不工作?

GCC:try 使用—WError或—pedantic using pragmas

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

为什么在C中设置文件的位置并写入文件,填充空字符?

VS代码C/C++扩展intellisense无法检测环境特定函数'

exit(EXIT_FAILURE):Tcl C API类似功能

ESP32在vTaskDelay上崩溃

如何识别Linux中USB集线器(根)和连接到集线器(根设备)的设备(子设备)?

这个计算C中阶乘的函数正确吗?

为什么数组的最后一个元素丢失了?

如何在VS 2022中正确安装额外的C头文件

链表删除 node 错误

无法识别C编程语言的语法,如书中所示

有没有办法减少C语言中线程的堆大小?

表达式x&;&;(~x)应该返回1还是0?它依赖于编译器吗?

如何打印循环调度问题的时间表

将不同类型的指针传递给函数(C)

在同一范围内对具有相同类型的变量执行的相同操作在同一C代码中花费的时间不同

函数指针作为函数参数 - 应该使用 const 吗?

使用fread()函数读取txt文件