關於c語言INT_MIN定義的問題

關於c語言INT_MIN定義的問題

最近看到一段代碼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 intide

寫了一段代碼驗證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

相關文章
相關標籤/搜索