Разница результатов `strcmp`
#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
Поясните, почему результаты отличаются?
Источник: Stack Overflow на русском