0

我正进入(状态

g++ -O3 cache-l1-line.cpp -o cache-l1-line -lrt
cache-l1-line.cpp: In function 'int main()':
cache-l1-line.cpp:33:58: warning: format '%d' expects argument of type 'int', but argument 2 has type 'long unsigned int' [-Wformat]

在我的学校 sunfire 服务器上......但不是我的机器(Arch Linux)。为什么会这样。有问题的行似乎是

printf("%d, %1.2f \n", i * sizeof(int), totalTime/TIMES);

我定义的地方:

for (int i = 4; i <= MAX_STRIDE/sizeof(int); i*=2)  {

什么问题:GitHub上的完整源代码(链接到修订)

4

3 回答 3

4

sizeof()返回一个size_t,而不是一个intprintf您应该始终将此类“特殊”类型转换为您的格式所期望的类型:

printf("%d, %1.2f \n", (int)(i * sizeof(int)), totalTime/TIMES);

注意:有些人喜欢深入他们的库以查看类型定义为什么类型,并在格式字符串中使用适当的类型。但是,这有两个问题:首先,它在另一个编译器上可能会有所不同。其次, asize_t不是 a long,它是 a size_t。因此,从更正式的角度来看,您将始终遇到类型不匹配,因为没有格式参数采用size_t.

于 2012-10-07T09:43:12.427 回答
1

在 64 位架构中,表达式计算为 64 位。因此,该体系结构中的正确说明符将是 %llu。或者相反,应该将表达式转换为说明符 %d 所期望的宽度和类型。

编辑: %llu 而不是 %lld - 感谢您的评论。

表达式 (i * size_t) 在不同的架构中具有不同的宽度和类型;它(unsigned int)显然在您的 i3 系统中和(unsigned long long)在您的 i7 系统中。

于 2012-10-07T09:52:41.737 回答
0

通常 printf 不是类型安全的,这意味着如果你有这样的东西:

struct Point {int x, int y} point;
printf("%d", point);

它会编译,但在执行时可能会崩溃。但是 gcc 有一个扩展,允许使用参数检查格式字符串。"%d" 需要一个 int 但 "i * sizeof(int)" 是 long unsigned int 类型,这就是您收到警告的原因。

于 2012-10-07T09:39:05.373 回答