Арифметика на uint8, int8 - PullRequest
       9

Арифметика на uint8, int8

0 голосов
/ 09 февраля 2019

В чем причина получения отрицательных и нулевых результатов в Арифметической операции для unit8 и int8 типов данных для данного примера

package main

import (
    "fmt"
)

func main() {

     var u uint8 = 255
     fmt.Println(u, u+1, u*u) // "255 0 1"
     var i int8 = 127
     fmt.Println(i, i+1, i*i) // "127 -128 1"
}

https://play.golang.org/p/_a2KHP29t5p

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Как показано в другом ответе, в отличие от некоторых других языков программирования, Go обрабатывает все целочисленные переполнения четко определенным образом, аналогично тому, что происходит в большинстве современных процессоров на уровне сборки.


127= 0111 1111 двоичное

, что + 1 = 1000 0000 двоичное

, которое интерпретируется как 8-разрядное целое число со знаком двоичного числа со знаком 2, равно -128.


255 = 1111 1111 двоичное

, что + 1 = 1 0000 0000 двоичное (примечание 9 бит)

Это было бы 256, если бы у нас было 9 бит, но у нас нет, у нас есть только 8, поэтому он становится 0000 0000двоичный файл, который равен 0.


Аналогично для умножения:

127 * 127 = 16129 = 0011 1111 0000 0001 bin

255 * 255 = 65025 =1111 1110 0000 0001 bin

Оба имеют младшие 8 битов, как 0000 0001 bin = 1


Примечание: большую часть времени, если вы полагаетесь на целочисленное переполнение, вы должнысделайте шаг назад и подумайте, если это лучший способ сделать то, что вы делаете.Это поведение очень низкого уровня, включающее точное побитовое поведение и всегда должно сопровождаться достаточным количеством комментариев, объясняющих, что и почему.

0 голосов
/ 09 февраля 2019

Go не паникует из-за целочисленного переполнения во время выполнения.Согласно doc :

Для целочисленных значений без знака операции +, -, * и << вычисляются по модулю 2n, где n - битовая ширина целого числа без знака.тип.Грубо говоря, эти целочисленные операции без знака отбрасывают старшие биты при переполнении, и программы могут полагаться на «обтекание». </p>

Для целых чисел со знаком операции +, -, *, / и << могут по закону переполняться ирезультирующее значение существует и детерминировано определяется целочисленным представлением со знаком, операцией и ее операндами.Исключение не возникает в результате переполнения.Компилятор может не оптимизировать код при условии, что переполнения не происходит.Например, он может не предполагать, что x <x + 1 всегда верно. </p>

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