Windows x64上没有溢出强制转换

Windows x64上没有溢出强制转换,windows,visual-c++,64-bit,32bit-64bit,Windows,Visual C++,64 Bit,32bit 64bit,我有一个在x86上工作的现有C代码库 我现在正在为x64编译它 我想做的是将一个大小t转换为DWORD,如果数据丢失,则抛出一个异常 Q:这有成语吗 这就是为什么我要这么做: 许多Windows API接受DWORD作为参数,并且代码当前假定sizeof(DWORD)==sizeof(size\t)。这种假设适用于x86,但不适用于x64。因此,在为x64编译时,传递size_t代替DWORD参数会生成编译时警告 在几乎所有这些情况下,实际大小不会超过2^32。但我想用防御性的、明确的方式编写

我有一个在x86上工作的现有C代码库

我现在正在为x64编译它

我想做的是将一个大小t转换为DWORD,如果数据丢失,则抛出一个异常

Q:这有成语吗


这就是为什么我要这么做:

许多Windows API接受DWORD作为参数,并且代码当前假定sizeof(DWORD)==sizeof(size\t)。这种假设适用于x86,但不适用于x64。因此,在为x64编译时,传递size_t代替DWORD参数会生成编译时警告

在几乎所有这些情况下,实际大小不会超过2^32。但我想用防御性的、明确的方式编写代码


这是我的第一个x64项目,所以。。。温柔一点。

参见boost::numeric\u cast


参见boost::numeric\u cast


我刚刚定义了一个函数来执行强制转换

我加入了一个类似断言的行为,以确保我不会默默地诋毁指针

DWORD ConvertSizeTo32bits(size_t sz, char *file, int line) 
{
    if (!(0 <= sz && sz <= INT32_MAX)) {
        EmitLogMessage("Invalid Pointer size: %d file(%s) line(%d)",
                       sz, file, line);

        ExitProcess( 0 );  
    }
    return (DWORD) sz;
}
DWORD CONVERTSIZETO32位(大小\u t sz,字符*文件,整数行)
{

如果(!(0我刚刚定义了一个函数来执行强制转换

我加入了一个类似断言的行为,以确保我不会默默地诋毁指针

DWORD ConvertSizeTo32bits(size_t sz, char *file, int line) 
{
    if (!(0 <= sz && sz <= INT32_MAX)) {
        EmitLogMessage("Invalid Pointer size: %d file(%s) line(%d)",
                       sz, file, line);

        ExitProcess( 0 );  
    }
    return (DWORD) sz;
}
DWORD CONVERTSIZETO32位(大小\u t sz,字符*文件,整数行)
{
如果(!(0)
编辑:

或者更好的做法是,这样您就可以在表达式中使用它:

DWORD MyRaiseException()
{
    RaiseException(1, 0, 0, NULL);
    return 0;
}


#define size_t_to_DWORD(st)  (DWORD)(st) != (st) ? MyRaiseException() : (DWORD)(st)


void main(void)
{
    size_t  st;
    DWORD   dw;
    st = 0xffffffff1;
    dw = size_t_to_DWORD(st);
    printf("%u %u\n", st, dw);
}
编辑:

或者更好的做法是,这样您就可以在表达式中使用它:

DWORD MyRaiseException()
{
    RaiseException(1, 0, 0, NULL);
    return 0;
}


#define size_t_to_DWORD(st)  (DWORD)(st) != (st) ? MyRaiseException() : (DWORD)(st)


void main(void)
{
    size_t  st;
    DWORD   dw;
    st = 0xffffffff1;
    dw = size_t_to_DWORD(st);
    printf("%u %u\n", st, dw);
}

那是C++,我也在使用C.,我只想抛出,我想要一个简单的成语,而不是一个库。那是C++,我用C.,我也只想抛出;我想要一个简单的成语,而不是一个库。