c - GCC 改变 signless 整个表达式
问题描述
我有以下代码:
unsigned int m_font_timer = 0;
int Getsum(int p_top_left_x)
{
int l_sum = (((p_top_left_x + (m_font_timer >> 2)) & 0x7) - 4 ) >> 2;
if (l_sum < 0) l_sum = -l_sum;
return l_sum;
}
除非我将m_font_timer显式转换为 (signed int),否则表达式的这一部分将变为无符号:
((p_top_left_x + (m_font_timer >> 2)) & 0x7) - 4 );
即使有一个“-4”并且 p_top_left_x 已签名。
这发生在使用 gcc 4.7.3 的 SH4 交叉编译器上(我正在为需要它的旧系统编程)。我没想到那部分会变成未签名的。我有这个代码在另外两个平台上运行,也使用 GCC(比这个更高的版本)和一个使用 MSCV,它们都将上述表达式保持为已签名。
我对编译器不太了解,这是未定义的行为吗?编译器有什么方法会警告我吗?我有-Wall -Wformat=0 -Wextra -Wsign-compare但在该功能中没有出现任何警告。
谢谢!
解决方案
推荐阅读
- ios - Swift 中的 UICollectionView 自定义单元格大小
- ubuntu - 如何基于 Ubuntu Termux 在 android 上搭建桌面环境?
- c++ - 将派生类的具体实现自注册到 std::map
- typescript - TypeScript 中的 MAC 地址
- shell - 为什么 GNU 会找到它被告知不要的匹配文件?(在一个大查询中)
- python - Zappa 在部署时未正确调用正确的虚拟环境
- javascript - Typescript 中的 try catch 太多了
- python - 如何通过对列进行分组来绘制 Python 中的数据框?
- python - 我想使用google api制作距离矩阵
- python - 如何将列表中的元素提取到numpy数组中