C语言 当你传递一个有符号的整数给一个函数,而这个函数需要一个无符号的整数来过滤/混合时,会发生什么?

yc0p9oo0  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(148)

我需要调整一些图像的大小,我使用的库是stb,免费的头只C库,它有uint8uint16uint32float的函数。我有一些符号为int16的图像,其值从负数到正数不等。如果编译器显式或隐式地将这些有符号整型转换为无符号整型,这些值会发生什么?我想它会完全坏掉。因此,我是否必须创建一个新的缓冲区,将它们转换为float,并调用float函数,然后将这些float值转换回int16?有没有更好的办法呢?

k2arahey

k2arahey1#

如果你将一个int16_t数组传递给一个需要uint16_t数组的函数,使用(uint16_t *)强制转换来消除编译器警告,那么代码是执行还是 break 取决于它如何处理32768到65535范围内的值。数组中的任何负值条目都将被读取为偏移65536的大正值,因此在0处具有很强的不连续性。
根据 filter 中实现的实际算法,效果将从 * 正常 * 到 * 意外 *,包括 * 令人惊讶 怪异 迷幻 * 等。

3qpi33ja

3qpi33ja2#

应考虑两件事:
1.在不同的设备之间是否存在通信?比如司机等等。则将检查字节顺序或者甚至两个无符号字节值将因体系结构而异,
1.当使用有符号整数时,第一位始终被视为整数符号,因此您将遵循2s补码表示,并且2的最大值将是2^15 - 1,而不是具有签名功能的2^16 - 1
因此:

  • 在uint16_t中,范围是从0. 65535
  • 而在int16_t中,范围是从-32768. 32767

相关问题