警告 639:二进制操作中类型 'uint64' 的强类型不匹配
Warning 639: Strong type mismatch for type 'uint64' in binary operation
我在不同的文件中获取这些警告。我试图解决它,但仍然对所有人都有相同的警告(所有6个场景)。
#define CMD_READ_ARRAY_FAST 0x0bU
uint64 page_size;
uint32 offset;
uint64 page_addr;
uint64 sector_size;
uint8_t cmd[5];
size_t len;
size_t actual;
1) page_addr = (uint64) (offset / page_size);
2) cmd[0] = CMD_READ_ARRAY_FAST;
cmd[1] = (uint8_t) (page_addr >> 8U);
cmd[2] = (uint8_t) page_addr;
cmd[3] = (uint8_t) (offset % page_size);
cmd[4] = 0x00U;
3)page_addr = (uint64) (offset / page_size);
4)byte_addr = (uint64) (offset % page_size);
5)if ((offset % sector_size) || (len % sector_size))
6)cmd[1] = (uint8_t) ((offset / sector_size) + actual);
您能告诉我原因吗?
我通过以这种方式解决了上述问题:
#define CMD_READ_ARRAY_FAST 0x0bU
uint64 page_size;
uint32 offset;
uint64 page_addr;
uint64 sector_size;
uint8_t cmd[5];
size_t len;
size_t actual;
1) page_addr = (uint64) (offset / page_size);
Ans: (uint64) ((uint64)offset / page_size);
2) cmd[0] = CMD_READ_ARRAY_FAST;
cmd[1] = (uint8_t) (page_addr >> 8U);
cmd[2] = (uint8_t) page_addr;
cmd[3] = (uint8_t) (offset % page_size);
cmd[4] = 0x00U;
Ans:cmd[0] = CMD_READ_ARRAY_FAST;
cmd[1] = (uint8_t) (page_addr >> 8U);
cmd[2] = (uint8_t) page_addr;
cmd[3] = (uint8_t) ((uint8_t)offset % page_size);
cmd[4] = 0x00U;
3)page_addr = (uint64) (offset / page_size);
Ans: page_addr = (uint64) ((uint64)offset / page_size);
4)byte_addr = (uint64) (offset % page_size);
Ans: byte_addr = (uint64) ((uint64)offset % page_size);
5)if ((offset % sector_size) || (len % sector_size))
Ans: if (((uint64)offset % sector_size) || ((uint64)len % sector_size)) {
6)cmd[1] = (uint8_t) ((offset / sector_size) + actual);
Ans: cmd[1] = (uint8_t) (((uint8_t)offset / (uint8_t)sector_size) + (uint8_t)actual);
您的警告源于在同一表达式中混合不同的整数类型,然后依靠隐式铸件。隐式演员总是不好的,无论是否米斯拉。
以下修复程序有望清除所有警告:
1)
page_addr = (uint64_t)offset / page_size;
2)除了第3行以外,一切看起来都还不错。
cmd[3] = (uint8_t) ((uint64_t)offset % page_size);
3)再次在操作前将UINT32_T施放到UINT64_T。
4)再次在操作前将UINT32_T施放为Uint64_t。
5)这里几起违反了米斯拉的行为。最好将其重写多个行,而不是一条长而不可读的行。例如:
bool cond1 = ((uint64_t)offset % sector_size) != 0;
bool cond2 = ((uint64_t)len % sector_size) != 0;
if (cond1 || cond2)
6)这可能还必须是几行才能保持可读:
uint64_t tmp = (uint64_t)offset / sector_size;
cmd[1] = (uint8_t) (tmp + (uint64_t)actual);
相关文章:
- Qt SQLite没有查询或参数计数不匹配
- 模板参数推导失败,函数参数/参数不匹配
- 在使用累加时,C++中的运算符+不匹配
- C++ 与操作员不匹配<<
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 与'operator='不匹配(操作数类型'String'且"void")
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- C4018:类内有符号、无符号不匹配
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 为什么我收到错误:"运算符<<不匹配?
- RE2 不匹配非 ASCII 字符
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- OpenSSL fips in C++ wrapper Library 如何?错误:指纹不匹配
- 为什么我的数组值与此处的全局变量不匹配?
- 引号之间匹配/不匹配,带有不可避免的引号和多行
- 映射迭代器与运算符不匹配
- C++调用和定义不匹配
- 警告 639:二进制操作中类型 'uint64' 的强类型不匹配