#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.

C++相关问答推荐

为什么在C中二维字符数组会有这样的行为?

如果我释放其他内容,返回值就会出错

C在声明带有值的数组时,声明大小有用吗?

将uintptr_t添加到指针是否对称?

GCC创建应用于移动项的单独位掩码的目的是什么?

防止C++中递归函数使用堆栈内存

C语言中的外部关键字

C语言中奇怪的输出打印数组

宏观;S C调深度

向左移位3如何得到以字节为单位的位数?

即使我在C++中空闲,也肯定会丢失内存

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

If语句默认为true

令人困惑的返回和 scanf 问题相关

C Makefile - 如何避免重复提及文件名

使用fread()函数读取txt文件

UEFI 应用程序中的计时器回调仅在 AMI BIOS 中挂起

为什么需要struct in_addr

C 预处理器中的标记分隔符列表

将字节/字符序列写入标准输出的最简单形式