#include <stdint.h>
uint8_t square(uint16_t num, int x) {
return (uint8_t)(num / x);
}
您应该显式地将uint16_t结果转换为uint8_t,还是让它隐式转换?我担心的是任何速度成本,以及编译器的抱怨,否则我认为这应该可以工作,即使强制转换结果被截断(在我的例子中不是这样,因为num/x保证适合uint8_t)
#include <stdint.h>
uint8_t square(uint16_t num, int x) {
return (uint8_t)(num / x);
}
您应该显式地将uint16_t结果转换为uint8_t,还是让它隐式转换?我担心的是任何速度成本,以及编译器的抱怨,否则我认为这应该可以工作,即使强制转换结果被截断(在我的例子中不是这样,因为num/x保证适合uint8_t)
您应该将uint16_t结果显式转换为uint8_t,还是让它 是不是被隐含地铸造了?
您计算int
而不是uint16_t
,因为uint16_t
将转换为int
,然后除以int
C标准版6.3.1.1 p.2
如果int可以表示原始类型的所有值,则该值为 转换为int;否则,转换为unsigned int. 这些被称为整数提升.48)所有其他类型都是 整数提升不变.
然后返回uint8_t
.将int
转换为uint_8
的方式也由以下标准定义:
否则,如果新类型是无符号的,则该值由 重复加减比最大值多1的值 可以用新类型表示,直到该值在 新的类型.
我担心的是速度成本,以及编译器的抱怨
演员阵容不会改变任何事情-结果将是一样的
即使强制转换结果被截断(在我的例子中没有 因为Num/x保证在
uint8_t
以内)
你的手术结果可能是negative.