#include <boost/cast.hpp>
//
void test1()
{
int i = 0;
size_t ui = -1; //编译警告:warning C4245: '=' : conversion from 'int' to 'size_t', signed/unsigned mismatch
//把这个值0xFFFF-FFFF放入ui,按照补码理解-1。
i = (int)ui; //强制转换,无编译警告. i的值为 0xFFFF-FFFF
}
//
void test2()
{
int i = 0;
size_t ui = std::numeric_limits<int>::max() + 1; //把 0x7FFF-FFFF + 1 放入ui
i = static_cast<int>(ui); //无编译警告,当强制转换时,也会无警告,是一样的。
//i的值是0x8000-0000
}
//由test1和test2可见:
//无符号的size_t和有符号int相互转换时,内存是直接拷贝的,二进制值不变,但是对二进制值的解释方式不同。
//编译器会给出警告,也可能不警告(被diable或者因强制转换语法而不显示警告了)
//
void test3()
{
int i = 0;
size_t ui = std::numeric_limits<int>::max()+1; //这个值,是故意设置的,int容纳不了的最大值。
try{
i = boost::numeric_cast<int>(ui);
}
catch(boost::bad_numeric_cast&)
{
std::cout<<"测试OK. 0x8000-0000 不能转 int"<<std::endl;
}
}
//
void test4()
{
int i = -1;
size_t ui = 0;
try{
ui = boost::numeric_cast<size_t>(i);
}
catch(boost::bad_numeric_cast&)
{
std::cout<<"测试OK. -1不能转size_t"<<std::endl;
}
}
//由test3,test4可见:
//运行期的检查,更具有可操作性。
//
int main()
{
test1();
test2();
test3();
test4();
system("pause");
}
学习笔记:int 和 size_t互转的最好解决方案
最新推荐文章于 2025-03-22 17:07:36 发布