AFAIK这是一个标准的"习语"
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
Run Code Online (Sandbox Code Playgroud)
问题:为什么INT_MIN的定义不是-2147483648?
根据MSDN(整数类型 - VC2008):
没有后缀的十进制常量的类型是int,long int或unsigned long int.可以表示常量值的这三种类型中的第一种是分配给常量的类型.
在Visual C++ 2008上运行以下代码:
void verify_type(int a){printf("int [%i/%#x]\n", a, a);}
void verify_type(unsigned int a){printf("uint [%u/%#x]\n", a, a);}
void verify_type(long a){printf("long [%li/%#lx]\n", a, a);}
void verify_type(unsigned long a){printf("ulong [%lu/%#lx]\n", a, a);}
void verify_type(long long a){printf("long long [%lli/%#llx]\n", a, a);}
void verify_type(unsigned long long a){printf("unsigned long long [%llu/%#llx]\n", a, a);}
int _tmain(int argc, _TCHAR* argv[])
{
printf("sizeof(int) %i\n", sizeof(int));
printf("sizeof(long) %i\n", sizeof(long));
printf("sizeof(long long) %i\n\n", sizeof(long long));
verify_type(-2147483647);
verify_type(-2147483648);
getchar();
return 0; …Run Code Online (Sandbox Code Playgroud) 我试过用C语言编写程序,程序结果如下:
输出:当iis 为0 unsigned int时,最后打印0 ,当值为i0时,控件不应该进入while循环,因为我已经给出了i>0条件,但是打印了0,我不明白它是怎么可能的.
当i进行签名int,然后0不打印.
请让我知道该计划中发生了什么.
#include <stdio.h>
#include <string.h>
main()
{
unsigned int i=1;
int c=1;
while(i>0)
{
i=i*2;
c++;
printf("%d\n",i);
}
printf("%d c value is",c) ;
}
Run Code Online (Sandbox Code Playgroud) 强制转换-1为 unsigned int是一种很好的代码风格吗?例如:
#define MAX_UINT8 ((uint8_t) -1)
Run Code Online (Sandbox Code Playgroud)
比较
#define MAX_UINT8 0xff
Run Code Online (Sandbox Code Playgroud)