警告:格式“%ld”需要“long int”类型的参数,但参数的类型为“__builtin_neon_di”

Posted

技术标签:

【中文标题】警告:格式“%ld”需要“long int”类型的参数,但参数的类型为“__builtin_neon_di”【英文标题】:warning: format '%ld' expects argument of type 'long int', but argument has type '__builtin_neon_di' 【发布时间】:2015-05-19 14:29:59 【问题描述】:

写我的this question,我无法交叉检查输出。 执行后我得到了一些错误的打印语句。有人可以告诉我printf() 语句是错误的还是我正在做的逻辑是错误的。

代码:

int64_t arr[2]  = 227802,9896688;
int64x2_t check64_2 = vld1q_s64(arr);

for(int i = 0;i < 2; i++)
    printf("check64_2[%d]: %ld\n",i,check64_2[i]);


int64_t way1   = check64_2[0] + check64_2[1];

int64x1_t way2 = vset_lane_s64(vgetq_lane_s64(check64_2, 0) + vgetq_lane_s64(check64_2, 1), way2, 0);

int64x1_t way3 = vadd_s64(vget_high_s64 (check64_2),vget_low_s64 (check64_2));

printf("way1 :%ld \n",way1);
printf("way2 :%ld \n",way2);
printf("way3 :%ld \n",way3);

输出:

check64_2[0]: 227802
check64_2[1]: 9896688
way1 :0 
way2 :0 
way3 :0 

警告:

 warning:format '%ld' expects argument of type 'long int', but argument 3 has type '__builtin_neon_di'printf("check64_2[%d]: %ld\n",i,check64_2[i]);
 warning:format '%ld' expects argument of type 'long int', but argument 2 has type 'int64_t aka long long int' [-Wformat=]
  printf("way1 :%ld \n",way1);
                            ^

谁能告诉我如何使用 log/printf 消息来确认逻辑。

【问题讨论】:

您也许可以将这些值转换为对应的 printf 预期类型:printf("check64_2[%d]: %ld\n", i, (long)check64_2[i]); ... printf("way1 :%ld\n", (long)way1); 或者使用"%lld",正如第二条错误消息所暗示的那样。 【参考方案1】:

您正在使用 NEON 扩展程序。它们不是普通变量,因为它们存储在 NEON 寄存器中。您需要使用特殊功能从它们中获取数据。例如,要读取单行 int64 值,您需要调用 vget_lane_s64。它将返回正常的 64 位数字,然后您可以将其提供给 printf()

是的,对于 64 位宽的变量,您需要 "%lld" 格式。

【讨论】:

以上是关于警告:格式“%ld”需要“long int”类型的参数,但参数的类型为“__builtin_neon_di”的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中使用 unsigned long long int 类型表示一定的秒数(分钟)

int 与long int类型转换

“long int”、“long long”数据类型

在 C 中,如何修复此警告:格式“%s”需要“char *”类型的参数,但参数 3 的类型为“char (*)[100]

如何使用 printf 格式化 unsigned long long int?

警告:格式“%d”需要类型“int”,但参数 2 的类型为“int (*)(int *)”[关闭]