小编Tom*_*ury的帖子

在将总和计算为更大的值时,是否在C中隐式转换?

我正在使用16位处理器,因此我的大多数数据都是16位,除非必要.

如果我有两个16位变量a并将b它们加在一起形成一个32位变量,那么编译器会做什么?

uint16_t x, y;
uint32_t z;
x = 65504;
y = 65503;
z = x + y;
Run Code Online (Sandbox Code Playgroud)

z中的结果是否相同z = (uint32_t)x + (uint32_t)y,或者我是否需要转换结果?

我已经在我的编译器上尝试了这个,并且转换似乎没有任何区别,但这可能只是这个小嵌入式处理器的编译器奇怪.

c casting

8
推荐指数
2
解决办法
656
查看次数

遍历C中的列表时是否看到优化错误?

我一直在努力将同事的软件库集成到我们的大型应用程序中。他一直在写作和下测试他的图书馆-O0gcc 4.9.3。这是用于警报系统的嵌入式软件。该错误是在-Os优化条件下观察到的,我们也在上使用了直接C语言(没有C ++废话)gcc 4.9.3。该体系结构是ARM Cortex-M4F。

我在将该代码集成到较大的堆栈中时遇到问题。以下代码最多应进行迭代,GLOBAL_MAX_DEVICES直到在表中找到可用空间以插入其条目为止:

RET_VALUES DEVICE_Add_To_New_Table( uint8_t *new_id, uint16_t unique_id )
{
    RET_VALUES ret_value = RET_OK;
    uint8_t pos = 0;

[...]
    else
    {
        debug_print( "A,", true, DEBUG_DEVELOP_MODE_PLAIN, DEBUG_TRACE );

        // See if the unique_id is already in the table (relearn)
        while(( unique_id != DEVICE_new_table.unique_id[pos] ) && ( pos < GLOBAL_MAX_DEVICES ))
        {
            debug_print( "B,", false, DEBUG_DEVELOP_MODE_PLAIN, DEBUG_TRACE );
            pos++;
        }
[...]
Run Code Online (Sandbox Code Playgroud)

我们遇到的问题是,它不是循环迭代GLOBAL_MAX_DEVICES次数(当前为13),而是迭代200多次。序列“ B”在while(( unique_id != …

c gcc compiler-optimization compiler-bug

3
推荐指数
1
解决办法
104
查看次数

C中的类型混合整数除法:编译器错误或定义的行为?

在为使用GCC编译的小型ARM处理器编写软件时,我遇到了一个怪癖.处理器没有硬件分区引擎,因此分区是用软件实现的.

以下代码复制了行为,volatile语句用于避免优化:

volatile int32_t x = -4000;
volatile uint32_t y = 4;
volatile int32_t z = x / y;

uart_printf(DBG_LVL_INFO, "%d / %d = %d\r\n", x, y, z);
Run Code Online (Sandbox Code Playgroud)

为z打印的结果是1073740824,但我希望得到的结果-1000.

类型混合似乎很关键.替换uint32_twith int32_t可以解决bug.

-1000错误地解释为无符号整数不会产生结果,有趣地看起来等于结果加上2 30.

这是一个错误,还是只是定义了行为?

c twos-complement

1
推荐指数
1
解决办法
67
查看次数