int:
32位int数据类型可以包含-2,147,483,648到2,147,483,647范围内的整数值.您也可以将此数据类型称为signed int或signed.
unsigned int:
32位无符号int数据类型可以包含0到4,294,967,295范围内的整数值.您也可以将此数据类型简称为无符号.
好的,但是,在实践中:
int x = 0xFFFFFFFF;
unsigned int y = 0xFFFFFFFF;
printf("%d, %d, %u, %u", x, y, x, y);
// -1, -1, 4294967295, 4294967295
Run Code Online (Sandbox Code Playgroud)
没有区别,噢我有点困惑.
以下程序具有未定义的行为:
#include <stdio.h>
int main(void)
{
unsigned int x = -100; // This is fine, becomes UINT_MAX - 100
printf("%d\n", x); // This is undefined behavior.
return 0;
}
Run Code Online (Sandbox Code Playgroud)
C99 7.19.6.1p8状态%d需要一个int参数.
C99 7.19.6.1p9声明"如果任何参数不是相应转换规范的正确类型,则行为 未定义."
但是,gcc -Wformat(包含在内-Wall)不会抱怨上述程序,为什么?这是一个错误,还是故意遗漏?
从gcc手册页:
-Wformat
Run Code Online (Sandbox Code Playgroud)
检查电话"printf"和"scanf"等,以确保提供参数指定适当的格式字符串类型,并在格式字符串指定的转换意义