Разница результатов `strcmp`

Рейтинг: 2Ответов: 0Опубликовано: 03.06.2023
#include <stdio.h>
#include <string.h>

int my_strcmp(const char* x, const char* y)
{
  int z = 0;
  do
  {
    z = ((int)*(const unsigned char*)x) - ((int)*(const unsigned char*)y);
    if (z != 0)
    {
      break;
    }
    ++x;
    ++y;
  } while (*x != '\0' && *y != '\0');
  return z;
}

typedef struct pair {
  const char* x;
  const char* y;
} pair_t;

pair_t pairs[] = {
  {"", ""},
  {"abc", ""},
  {"", "abc"},
  {"abc", "def"},
  {"def", "abc"},
  {"abc", "abc"},
  {"abc", "abd"},
  {"abd", "abc"},
  {"a", "a"},
  {NULL, NULL}
};

int main(void)
{
  pair_t* p = &pairs[0];
  while (p->x != NULL &&
         p->y != NULL)
  {
    printf(
      "'%s', '%s' = %d, %d\n",
      p->x,
      p->y,
      my_strcmp(p->x, p->y),
      strcmp(p->x, p->y));
    ++p;
  }
  return 0;
}

Решил написать свою собственную реализацию strcmp (см выше). При выполнении в Linux ARM/AArch64, результаты странные:

Android Termux ARMv8l:

'', '' = 0, 0
'abc', '' = 97, 97
'', 'abc' = -97, -97
'abc', 'def' = -3, -3
'def', 'abc' = 3, 3
'abc', 'abc' = 0, 0
'abc', 'abd' = -1, -32
'abd', 'abc' = 1, 1
'a', 'a' = 0, 0

Ubuntu AArch64:

'', '' = 0, 0
'abc', '' = 97, 194
'', 'abc' = -97, -97
'abc', 'def' = -3, -96
'def', 'abc' = 3, 96
'abc', 'abc' = 0, 0
'abc', 'abd' = -1, -32
'abd', 'abc' = 1, 32
'a', 'a' = 0, 0

Но при выполнении на Kali Linux x86-64 все хорошо, вывод, такой, какой и ожидается:

'', '' = 0, 0
'abc', '' = 97, 97
'', 'abc' = -97, -97
'abc', 'def' = -3, -3
'def', 'abc' = 3, 3
'abc', 'abc' = 0, 0
'abc', 'abd' = -1, -1
'abd', 'abc' = 1, 1
'a', 'a' = 0, 0

Поясните, почему результаты отличаются?

Ответы

Ответов пока нет.