Битовая операция превращает целое число со знаком в беззнаковое - PullRequest
2 голосов
/ 10 июля 2020

Компьютер использует дополнение до двух для хранения целых чисел. Скажем, для подписанного 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 в такой ситуации?

1 Ответ

2 голосов
/ 10 июля 2020

Проблема в том, что размер int не фиксирован, он зависит от платформы. Это может быть 32 или 64 бита. В последнем случае присвоение ему 0xffffffff эквивалентно присвоению ему 4294967295, которое вы видите напечатанным.

Теперь, если вы конвертируете это значение в int32 (которое является 32-битным) , вы получите свой -1:

a := int(0xffffffff)
fmt.Printf("%d\n", a)

b := int32(a)
fmt.Printf("%d\n", b)

Это будет вывод (попробуйте на Go Playgroung ):

4294967295
-1

Также обратите внимание что в Go невозможно назначить 0xffffffff непосредственно значению типа int32, потому что значение будет переполняться; также недопустимо создание типизированной константы с недопустимым значением, например int32(0xffffffff). Spe c: Константы:

Значения типизированных констант всегда должны быть точно представимые значениями типа константы .

Таким образом, это дает ошибку времени компиляции:

var c int32 = 0xffffffff // constant 4294967295 overflows int32

Но вы можете просто сделать:

var c int32 = -1

Вы также можете:

var c = ^int32(0) // -1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...