Как рассчитать переполнение голанга? - PullRequest
0 голосов
/ 13 января 2019

Я новичок на Голанге

package main

import "fmt"

func main() {
    var u uint8 = 255
    var m uint16 = 255
    fmt.Println(u, u-1, u*(u-1))
    fmt.Println(m, m+1, m*m)
}

OUTPUT

./g2
255 254 2
255 256 65025

Я понимаю, что у меня переполнение в первом случае. Но почему я получил 2 в результате?

1 Ответ

0 голосов
/ 13 января 2019

Вы уже намекали на переполнение, и на самом деле это именно то, что здесь происходит. Вы уже знаете, что такое u и u-1 (255 и 254 соответственно), поэтому давайте умножим их вместе. Это дает нам 64770, или в двоичном виде:

64770       = 1111 1101 0000 0010

Этот результат имеет ширину 16 бит, но мы храним его в uint8, который имеет ширину всего 8 бит. Поэтому он усекается до 8 младших значащих битов. Математически это эквивалентно выполнению 64770 мод 2 ^ 8 или 64770 мод 256 . С программной точки зрения это эквивалентно выполнению 64770 & (1 << 7) или 64770 & 256:

64770       = 1111 1101 0000 0010
256         =           1111 1111
64770 & 256 = 0000 0000 0000 0010 = 2

Как бы вы ни представляли эту операцию, результат равен 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...