Следующая программа
#include <inttypes.h> /* printf(" %" PRIu32 "\n"), my_uint32_t) */
#include <stdio.h> /* printf(), perror() */
int main(int argc, char *argv[])
{
uint64_t u64 = ((unsigned char)0x80) << 24;
printf("%" PRIX64 "\n", u64);
/* uint64_t */ u64 = ((unsigned int)0x80) << 24;
printf("%016" PRIX64 "\n", u64);
}
производит
FFFFFFFF80000000
0000000080000000
В чем разница между ((unsigned char)0x80)
и ((unsigned int)0x80)
в этом контексте?
Я предполагаю, что (unsigned char)0x80
получает повышение до (unsigned char)0xFFFFFFFFFFFFFF80
, а затем сдвигается бит, но почему это преобразование считает, что подпись unsigned char
подписана?
Интересно также отметить, что 0x80 << 16
дает ожидаемый результат, 0x0000000000800000
.