我需要调整一些图像的大小,我使用的库是stb,免费的头只C库,它有uint8,uint16,uint32和float的函数。我有一些符号为int16的图像,其值从负数到正数不等。如果编译器显式或隐式地将这些有符号整型转换为无符号整型,这些值会发生什么?我想它会完全坏掉。因此,我是否必须创建一个新的缓冲区,将它们转换为float,并调用float函数,然后将这些float值转换回int16?有没有更好的办法呢?
uint8
uint16
uint32
float
int16
k2arahey1#
如果你将一个int16_t数组传递给一个需要uint16_t数组的函数,使用(uint16_t *)强制转换来消除编译器警告,那么代码是执行还是 break 取决于它如何处理32768到65535范围内的值。数组中的任何负值条目都将被读取为偏移65536的大正值,因此在0处具有很强的不连续性。根据 filter 中实现的实际算法,效果将从 * 正常 * 到 * 意外 *,包括 * 令人惊讶 , 怪异 , 迷幻 * 等。
int16_t
uint16_t
(uint16_t *)
0
3qpi33ja2#
应考虑两件事:1.在不同的设备之间是否存在通信?比如司机等等。则将检查字节顺序或者甚至两个无符号字节值将因体系结构而异,1.当使用有符号整数时,第一位始终被视为整数符号,因此您将遵循2s补码表示,并且2的最大值将是2^15 - 1,而不是具有签名功能的2^16 - 1因此:
2条答案
按热度按时间k2arahey1#
如果你将一个
int16_t
数组传递给一个需要uint16_t
数组的函数,使用(uint16_t *)
强制转换来消除编译器警告,那么代码是执行还是 break 取决于它如何处理32768到65535范围内的值。数组中的任何负值条目都将被读取为偏移65536的大正值,因此在0
处具有很强的不连续性。根据 filter 中实现的实际算法,效果将从 * 正常 * 到 * 意外 *,包括 * 令人惊讶 , 怪异 , 迷幻 * 等。
3qpi33ja2#
应考虑两件事:
1.在不同的设备之间是否存在通信?比如司机等等。则将检查字节顺序或者甚至两个无符号字节值将因体系结构而异,
1.当使用有符号整数时,第一位始终被视为整数符号,因此您将遵循2s补码表示,并且2的最大值将是2^15 - 1,而不是具有签名功能的2^16 - 1
因此: