相关疑难解决方法(0)

"int"和"unsigned int"之间的真正区别

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)

没有区别,噢我有点困惑.

c

51
推荐指数
6
解决办法
23万
查看次数

为什么gcc -Wformat没有在unsigned int上警告printf%d?

以下程序具有未定义的行为:

#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"等,以确保提供参数指定适当的格式字符串类型,并在格式字符串指定的转换意义

c gcc gcc-warning format-specifiers format-string

9
推荐指数
1
解决办法
2467
查看次数

标签 统计

c ×2

format-specifiers ×1

format-string ×1

gcc ×1

gcc-warning ×1