Преобразуйте типы данных, не изменяя базовые данные
Y = typecast(X, type)
Y = typecast(X, type)
преобразовывает числовое значение в X
к типу данных, заданному type
. Вход X
должен быть полным, некомплексным, числовым скаляром или вектором. Вход type
является набором строки к одному из следующего: 'uint8'
, 'int8'
, 'uint16'
, 'int16'
, 'uint32'
, 'int32'
, 'uint64'
, 'int64'
, 'single'
или 'double'
.
typecast
отличается от функции MATLAB® cast
в этом, это не изменяет входные данные. typecast
всегда возвращает то же количество байтов в выводе Y
, как были во входе X
. Например, кастинг 16-битного целого числа 1000 к uint8
с typecast
возвращает полные 16 битов в двух 8-битных сегментах (3 и 232) таким образом хранение его исходного значения (3*256 + 232 = 1000). Функция cast
, с другой стороны, обрезает входное значение до 255.
Вывод typecast
может быть отформатирован по-другому, в зависимости от какой системы вы используете его на. Некоторые компьютерные системы хранят данные начиная с его старшего значащего байта (упорядоченное расположение вызвало обратный порядок байтов), в то время как другие запускают с младшего значащего байта (названный прямым порядком байтов).
MATLAB выдает ошибку, если X
содержит меньше значений, чем необходимо, чтобы сделать выходное значение.
Этот пример преобразовывает между типами данных, одного размера:
typecast(uint8(255), 'int8') ans = -1 typecast(int16(-1), 'uint16') ans = 65535
Установите X на 1 3 вектор 32-битных целых чисел, затем бросьте его к 8-битному целочисленному типу:
X = uint32([1 255 256]) X = 1 255 256
Выполнение этого в системе с прямым порядком байтов приводит к следующим результатам. Каждое 32-битное значение разделено в четыре 8-битных сегмента:
Y = typecast(X, 'uint8') Y = 1 0 0 0 255 0 0 0 0 1 0 0
Третий элемент X
, 256, превышает 8 битов, что это преобразовывается в в Y
(9) и таким образом переполняется к Y
(10):
Y(9:12) ans = 0 1 0 0
Обратите внимание на то, что length(Y)
равен 4.*length(X)
. Также отметьте различие между выводом typecast
по сравнению с тем из cast
:
Z = cast(X, 'uint8') Z = 1 255 255
Этот пример бросает меньший тип данных (uint8
) в больший один (uint16
). Отображение чисел в шестнадцатеричном формате облегчает видеть, как данные перестраиваются:
format hex X = uint8([44 55 66 77]) X = 2c 37 42 4d
Первый typecast
сделан в системе с обратным порядком байтов. Четыре 8-битных сегмента входных данных объединены, чтобы произвести два 16-битных сегмента:
Y = typecast(X, 'uint16') Y = 2c37 424d
Второе сделано в системе с прямым порядком байтов. Отметьте различие в порядке байтов:
Y = typecast(X, 'uint16') Y = 372c 4d42
Можно отформатировать вывод с прямым порядком байтов в обратный порядок байтов (и наоборот) использование функции swapbytes
:
Y = swapbytes(typecast(X, 'uint16')) Y = 2c37 424d
Этот пример пытается сделать 32-битное значение из вектора трех 8-битных значений. MATLAB выдает ошибку, потому что существует недостаточное количество байтов во входе:
format hex typecast(uint8([120 86 52]), 'uint32') Error using typecast Too few input values to make output type.
Повторите пример, но с вектором четырех 8-битных значений, и он дает ожидаемый ответ:
typecast(uint8([120 86 52 18]), 'uint32') ans = 12345678