Возвращаемое значение memcmp, несогласованность
Вот небольшой код 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);
Стандартный вывод это:
val 1 : 128
val 2 : -1
Есть ли объяснение разницы между вызовом двух функций? Спасибо за вашу помощь.
версия лязга:
Apple LLVM версия 9.0.0 (clang-900.0.39.2) Цель: x86_64-apple-darwin16.7.0
1 ответ
Согласно документации POSIX, memcmp()
внутренне используетunsigned char
,
Я полагаю, ваш char
является signed
,
Я думаю (если я правильно интерпретирую https://godbolt.org/z/iOIbil), что memcmp()
с литералами не вызывает код в стандартной библиотеке, а сам компилятор заменяет сравнение вызовов -1
а также 0
('\200'
является 1 + 0b1111111
); memcmp()
Вызов с переменными вызывает код в стандартной библиотеке, которая преобразует первоначально подписанный символ в unsigned char
и сравнивает 128
а также 0
,