gpt4 book ai didi

C 无符号模导致编译器警告

转载 作者:太空狗 更新时间:2023-10-29 17:21:24 25 4
gpt4 key购买 nike

在一些用于 MC9S12C32 微 Controller 的嵌入式 C 代码中,我有一个循环队列(又名循环缓冲区),它使用静态大小的字节数组和队列前后的两个“指针”实现,它们实际上只是索引对于队列的数组。

// call unsigned chars bytes
typedef unsigned char byte;
byte trear = 0; // SCI transmit display buffer IN index
byte tfront = 0; // SCI transmit display buffer OUT index
byte tsize = 16; // size of transmit buffer
byte tbuf[16]= {0};// SCI transmit display buffer

请注意,trear 是后元素的实际索引,但 tfront 比前元素的实际索引少一(当然要对 16 取模)。因此,例如,如果我的缓冲区包含“hello”,它可能看起来像这样(空槽是垃圾值):

_________________________________
| | |h|e|l|l|o| | | | | | | | | |
^ ^
front rear

当需要从队列中删除一个字节时,我会这样做:

// increment front index
tfront++;
// wrap front index if it exceeded bounds
tfront %= tsize; // (A)
// get character to transmit
byte outputChar = tbuf[tfront];

一切正常——至少,我的程序没有出现与该片段相关的错误。然而,当我编译这个程序时,我的编译器警告我上面片段中标记为 (A) 的行,并提示:

Warning : C2705: Possible loss of data

main.c line 402

第 402 行是 (A) 行。我应该注意,我没有使用 gcc 或类似的东西;我在 Freescale 的 CodeWarrior IDE 中编译,它有时会给我一些其他有点神秘的警告。为了消除警告,我将上面的片段重写为:

// increment front index mod tsize
tfront = (tfront + 1 >= tsize) ? 0 : tfront + 1; // (B)
// get character to transmit
byte outputChar = tbuf[tfront];

但是,我的编译器仍然发出相同的警告,这次是关于 (B) 行。也许编译器告诉我,在语句 (tfront + 1 >= tsize) 中,tfront 可能在执行前为 255,并溢出。当然,我知道这不会发生,但我的编译器不会。

但是,如果是这种情况,为什么行 (A) 是一个问题?基本上,我想知道编译器对什么不满意。


自打出我的问题后,我通过将 tsize 从变量类型更改为预处理器定义(即 #define TSIZE 16)解决了这个问题。不过,我的问题仍然存在。


一些相关问题:
unsigned overflow with modulus operator in C
modulus operator with unsigned chars

最佳答案

编译器警告可能来自于 tfront %= tsize; 等价于 tfront = tfront % tsize;,因为 C 中的提升规则表达式 tfront % tsize 具有 (*) 类型 int

如果您改为编写 tfront = (byte)(tfront % tsize);,它可能会使编译器静音。

没有特别的理由担心,你的编译器确实发出了奇怪的警告:虽然表达式 tfront % tsize 在技术上具有类型 int,但它的值都适合byte 因为它的计算方式。即使值不完全适合 byte,无符号整数类型的 C 标准也保证了环绕行为(因此您有理由故意使用这种环绕行为).

(*) 除非在您的编译平台上 int 不能包含 unsigned char 可以采用的所有值,在这种情况下它将是 unsigned int 类型 并且您可能看不到警告。

关于C 无符号模导致编译器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19980664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com