学习笔记:int 和 size_t互转的最好解决方案

#include  

//////////////////////////////////////////////////////////////////////////////////////////////////
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::max() + 1;  //把 0x7FFF-FFFF + 1 放入ui
    i = static_cast(ui); //无编译警告,当强制转换时,也会无警告,是一样的。           
                              //i的值是0x8000-0000
} 

//由test1和test2可见:
//无符号的size_t和有符号int相互转换时,内存是直接拷贝的,二进制值不变,但是对二进制值的解释方式不同。
//编译器会给出警告,也可能不警告(被diable或者因强制转换语法而不显示警告了)

//////////////////////////////////////////////////////////////////////////////////////////////////
void test3()
{
    int     i = 0;
    size_t ui = std::numeric_limits::max()+1;  //这个值,是故意设置的,int容纳不了的最大值。
    try{
        i = boost::numeric_cast(ui);
    }
    catch(boost::bad_numeric_cast&)
    { 
        std::cout<<"测试OK. 0x8000-0000 不能转 int"<(i);
    }
    catch(boost::bad_numeric_cast&)
    { 
        std::cout<<"测试OK. -1不能转size_t"<

你可能感兴趣的:(学习笔记:int 和 size_t互转的最好解决方案)