Почему я получаю отрицательное целое число после добавления двух положительных 16-битных чисел? - PullRequest
0 голосов
/ 05 мая 2018

Я новичок на Голанге, на самом деле, я новичок в программировании на основе типов. Я знаю только JS.

Проходя простые примеры в учебниках по Голангу. Я обнаружил, что добавление a1 + a2 дает отрицательное целочисленное значение?

var a1 int16 = 127
var a2 int16 = 32767

var rr int16 = a1 + a2

fmt.Println(rr)

Результат:

-32642

Исключено:

  1. Компилятор выдаст ошибку, превышающую макс.
  2. (ИЛИ) GO автоматически конвертирует int16 в int32.
  3. 32894

Не могли бы вы, ребята, объяснить, почему он показывает -32642.

Ответы [ 3 ]

0 голосов
/ 05 мая 2018

Это очень просто. 16-разрядное целое число отображает положительную часть I 0 - 32767 (0x0000, 0x7FFF) и отрицательную часть с 0x8000 (-32768) на 0xFFFF (-1).

Например, 0 - 1 = -1, и он хранится как 0xFFFF.

Теперь в вашем конкретном случае: 32767 + 127.

Вы переполнены, потому что 32767 является максимальным значением для 16-разрядного целого числа со знаком, но, если принудительно добавить 0x7FFF + 7F = 807E и преобразовать 807E в 16-разрядное целое число со знаком, вы получите -32642 .

Вы можете лучше понять здесь: Подписанные числовые представления

0 голосов
/ 05 мая 2018

Дополнительно, проверьте эти математические константы :

const (
    MaxInt8   = 1<<7 - 1
    MinInt8   = -1 << 7
    MaxInt16  = 1<<15 - 1
    MinInt16  = -1 << 15
    MaxInt32  = 1<<31 - 1
    MinInt32  = -1 << 31
    MaxInt64  = 1<<63 - 1
    MinInt64  = -1 << 63
    MaxUint8  = 1<<8 - 1
    MaxUint16 = 1<<16 - 1
    MaxUint32 = 1<<32 - 1
    MaxUint64 = 1<<64 - 1
)

И проверьте человеческую версию этих значений здесь

0 голосов
/ 05 мая 2018

Это результат переполнения целых чисел , который ведет себя так, как определено в спецификации.

Вы не видите ожидаемых результатов, потому что

  1. Переполнение происходит во время выполнения, а не во время компиляции.
  2. Go имеет статическую типизацию.
  3. 32 894 больше максимального значения, представляемого int16.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...