возвращаемое значение memcmp, несогласованность - PullRequest
0 голосов
/ 29 ноября 2018

Вот небольшой код C, чтобы выделить проблему с возвращаемым значением memcmp:

    char *str1 = "\200";
    char *str2 = "\0";

    int val1 = memcmp(str1, str2, 2);
    int val2 = memcmp("\200", "\0", 2);

    printf("val 1 : %d \n",val1);
    printf("val 0 : %d \n",val2);

Stdout:

val 1 : 128
val 2 : -1

Есть ли объяснение для различия между двумя функциямивызов?Спасибо за вашу помощь.

версия clang:

Apple LLVM версия 9.0.0 (clang-900.0.39.2) Цель: x86_64-apple-darwin16.7.0

1 Ответ

0 голосов
/ 29 ноября 2018

Согласно документации POSIX, memcmp() внутренне использует unsigned char.

Я полагаю, ваш char равен signed.

Моя догадка (еслиЯ правильно интерпретирую https://godbolt.org/z/iOIbil), что memcmp() с литералами не вызывает код в стандартной библиотеке , а сам компилятор заменяет вызов, сравнивающий -1 и 0 ('\200' является 1 + 0b1111111);memcmp() вызов с переменными вызывает код в стандартной библиотеке , которая преобразует первоначально подписанный символ в unsigned char и сравнивает 128 и 0.

...