Компьютер использует дополнение до двух для хранения целых чисел. Скажем, для подписанного int32 0xFFFFFFFF представляет «-1». Согласно этой теории, нетрудно написать такой код в C, чтобы инициализировать целое число со знаком в -1;
int a = 0xffffffff;
printf("%d\n", a);
Очевидно, результат будет -1
.
Однако в Go один и тот же logi c выгружает по-разному.
a := int(0xffffffff)
fmt.Printf("%d\n", c)
Фрагмент кода печатает 4294967295
, максимальное число, которое может содержать тип uint32. Даже если я приведу c
явно в fmt.Printf("%d\n", int(c))
, результат все равно останется тем же.
Та же проблема возникает, когда некоторые битовые операции накладываются и на целое число со знаком, сделайте подписанное беззнаковым.
Итак, что происходит с Go в такой ситуации?