问题描述:隐式类型转换问题
cpp
if (optimize_param.dynamic_lds_size > 64UL * 1024UL)
这里在64后面加上UL表示"usigned long"类型的常量,为了防止在计算或者比较过程中出现类型转换的问题。
举例说明隐式类型转换问题:
cpp
#include <iostream>
int main(int argc, char const *argv[])
{
unsigned int a = 10000U;
int b = -1;
/*
详细说明:-1在计算机中以二进制补码的方式存储,即 1111 1111 1111 1111 1111 1111 1111 1111。
int b = -1; 将 1111 1111 1111 1111 1111 1111 1111 1111 按照int类型解释,即-1
转成unsigned int即,将 1111 1111 1111 1111 1111 1111 1111 1111 按照unsigned int类型解释,即4,294,967,295
*/
if (a > b) // 这里进行比较的时候,b隐式的转成了a的类型unsigned int类型。即:b 变成 2^32大小
{
std::cout << "a > b" << std::endl;
}
else
{
std::cout << "a < b" << std::endl;
}
return 0;
}
修改方案:使用显式类型转换
隐式类型转换可能导致二进制解释的不一致,显示类型转换是让数据表示类型一致。
隐式类型转换中特别是 有符号和无符号之间得转换 会有二进制解释得问题。
cpp
#include <iostream>
int main(int argc, char const *argv[])
{
unsigned int a = 10000U;
// int b = -1;
int b = static_cast<unsigned int>(-1); //使用显式类型转换避免隐式类型转换存在的问题
if (a > b)
{
std::cout << "a > b" << std::endl;
}
else
{
std::cout << "a < b" << std::endl;
}
return 0;
}