Предупреждение: формат "%ld" ожидает аргумент типа "long int", но аргумент имеет тип "__builtin_neon_di"

В связи с этим вопросом я не могу перепроверить результаты. После выполнения я получаю неправильное заявление на печать. Может кто-нибудь сказать мне, 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.

1 ответ

Вы используете расширения NEON. Они не являются обычными переменными, так как они хранятся в регистрах NEON. Вам нужно использовать специальную функцию для извлечения данных из них. Например, чтобы прочитать значение int64 с одной строкой, вам нужно вызвать vget_lane_s64, Он вернет нормальный 64-битный номер, который вы можете затем передать printf(),

И да, для 64-битных переменных вам нужно "%lld" формат.

Другие вопросы по тегам