c - int最快的c算术方法

标签 c math binary overflow

我正在编写一个 C 程序。我有一个无符号整数(16 位),其值在任何时候都可以是任何值,我有一个有符号字符(8 位),其值在数据类型的明显限制内任何时候都可以是任何值。我需要将带符号的 char 添加到无符号的 int,结果是一个无符号的 int,如果值溢出超过 0xFFFF 或低于 0x00,我需要结果等于限制(0x00 或 0xFFFF)。我想知道最快的方法是什么?我的方法如下所示,但它使用了长数据类型,因此使用了长二进制算术,所以我猜测有更快的方法...

long i;
unsigned int result;

i = someUINT + someCHAR;

if(i <= 0) 
{
    result = 0;
}
else if(i >= 0xFFFF)
{
    result = 0xFFFF;
}
else 
{
    result = (unsigned int)i;
}

编辑:我正在使用 16 位 MCU(PIC24HJ 系列)和 Microchip C30 编译器。

最佳答案

几乎可以肯定,正确答案是

if(i <= 0) 
{
    result = 0;
}
else if(i >= 0xFFFF)
{
    result = 0xFFFF;
}
else 
{
    result = (unsigned int)i;
}

分析应用程序,如果这是一个瓶颈(我非常非常怀疑),然后重写它。


现代编译器非常擅长为这样的代码编写无分支条件,所以只需按照最有意义的方式编写它,让编译器完成它的工作。不要混淆编译器和任何可怜的人将来必须通过使用一些令人费解的位摆弄黑客来阅读这段代码。

关于c - int最快的c算术方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5186044/

相关文章:

jquery - 简单的 jQuery 算术

python - 是否使用python来进行巨大的计算?

c++ - 库可以包含多个绑定(bind)吗

c - C中的bmp图像数据

c - 为什么我的回文函数不起作用?

java - 使用 JNI 问题构建 .so 文件

无法在 C 中定义函数类型

java - Java 中两个 double 的符号比较

c++ - 如何找到鼠标事件的来源?

objective-c - 获取最左边的位