最近看到一段代碼html
#define INT_MAX 2147483647 #define INT_MIN (-INT_MAX - 1)
INT_MIN的值應該爲 -2147483648,爲何不直接定義呢?因而搜索了一下,參考了Jack47的blog:C語言中TMin的寫法這篇文章。app
我的理解爲C語言在處理程序中常量時,符號-
和後面的值是分開處理的,先處理字面值,而後將-
做爲一元運算符。處理字面值的時候會決定這個常量的類型,基本的規則是選能容納字面值的最小類型。如32位系統,2147483648這個值決定爲unsigned int
,若是使用#define INT_MIN (-2147483648)
這個定義,INT_MIN類型爲unsigned int
。ide
寫了一段代碼驗證code
#include <stdio.h> #define INT_MAX 2147483647 #define INT_MIN (-INT_MAX - 1) // TMIN is unsigned int #define TMIN (-2147483648) int main(){ int i = 1; if (i > TMIN) printf("%d > tmin\n", i); else printf("%d < tmin\n", i); if (i > INT_MIN) printf("%d >INT_MIN\n", i); printf("%d\n",sizeof(TMIN)); }
運行結果爲htm
1 < tmin 1 >INT_MIN 4
補充:blog
CSAPP的補充材料waside-tmin.pdfget
上面的例子說明了不一樣格式字面值在C90和C99下面的類型肯定的規則,C90 32位下類型爲unsigned,就會產生上面程序的結果。io
對於這種會產生不一樣行爲的代碼最好避免.pdf