Путаница вокруг преобразования из uint8 в int8
Преобразование uint8 в int8 в Go может привести к неожиданному поведению, как показано ниже пример:
package main
import (
"fmt"
)
func main() {
a := int8(0xfc) // Compile error: constant 252 overflows int8
}
Код завершается с ошибкой времени компиляции, поскольку константа 0xfc выходит за пределы диапазона int8 (от -128 до 127). Однако следующий код компилируется без ошибок:
package main
import (
"fmt"
)
func main() {
a := 0xfc
b := int8(a) // Ok
}
Разница заключается в порядке операций. В первом примере константа преобразуется в int8 перед присвоением a. Во втором примере a сначала присваивается значение 0xfc, а затем преобразуется в int8.
Согласно спецификации языка Go, константные выражения должны быть представлены константным типом. В этом случае 0xfc не может быть представлен как int8, что приводит к ошибке компиляции.
Однако, когда преобразование выполняется после присваивания, значение a (которое больше не является константой) находится в диапазоне int8, что позволяет успешно выполнить преобразование.
Для практических случаев использования рассмотрим следующий пример:
type Char byte
var c Char = '世' // Error: '世' has value 0x4e16, too large.
Этот код вызывает ошибку, поскольку значение константы '世' (0x4e16) превышает диапазон байтов ( от 0 до 255). Чтобы это исправить, можно использовать следующий прием:
var c Char = Char('世') // Ok
В этом случае '世' сначала присваивается тип байта, а затем преобразуется в Char. Это гарантирует, что значение находится в диапазоне типа Char. Аналогичные методы можно применять при преобразовании байтов в int32 с учетом знака результирующего значения.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3