2

哇,我以为我知道我的 C++,但这很奇怪

这个函数返回一个无符号整数,所以我认为这意味着我永远不会返回一个负数,对吧?

该函数确定您比 UTC 提前或落后多少小时。所以对我来说,我在澳大利亚悉尼,所以我是 +10 GMT,这意味着我是 UTC = LocalTime + (-10)。因此 GetTimeZoneInformation 正确地确定我是 -10。

但是我的函数返回一个无符号整数,所以它不应该返回 10 而不是 -10 吗?

unsigned int getTimeZoneBias()
{
    TIME_ZONE_INFORMATION tzInfo;
    DWORD res  = GetTimeZoneInformation( &tzInfo );

    if ( res == TIME_ZONE_ID_INVALID )
    {
        return (INT_MAX/2); 
    }

    return (unsigned int(tzInfo.Bias / 60));  // convert from minutes to hours         
}

TCHAR ch[200];
_stprintf( ch, _T("A: %d\n"), getTimeZoneBias()); // this prints out A: -10
debugLog += _T("Bias: ") + tstring(ch) + _T("\r\n");
4

4 回答 4

10

您正在尝试将 an 打印unsigned intsigned int. 更改%d%u

_stprintf( ch, _T("A: %u\n"), getTimeZoneBias());
                       ^

问题是对于大多数计算机来说,整数本身并不是正数或负数。这是他们被解释的方式。

因此,一个大整数可能与一个小的(绝对值)负整数无法区分。

于 2011-10-01T04:11:59.177 回答
4

这是我认为正在发生的事情:

的值tzInfo.Bias实际上是-10。( 0xFFFFFFF6) 在大多数系统上,将有符号整数转换为相同大小的无符号整数对表示没有任何作用。

所以函数仍然返回0xFFFFFFF6

但是,当您将其打印出来时,您会将其作为有符号整数打印回来。所以它打印-10。如果您将其打印为无符号整数,您可能会得到4294967286.

您可能想要做的是获得时间差的绝对值。因此,您想将此 -10 转换为 10。您应该在其中返回abs(tzInfo.Bias / 60).

于 2011-10-01T04:13:48.787 回答
2

_T您的电话中有一个错误。它应该是:

_T("A: %u\n")

该函数确实返回一个非负整数。但是,通过使用错误的 printf 说明符,会导致它作为整数从堆栈中弹出。换句话说,这些位被错误地解释了。我相信这也是未定义的行为。

于 2011-10-01T04:12:02.137 回答
1

正如其他人指出的那样,当您转换为 时unsigned int,您实际上是在告诉编译器使用中的位模式int并将其用作unsigned int. 如果您的计算机像大多数人一样使用二进制补码,那么您的数字将被解释为UINT_MAX-10而不是10您所期望的。当您使用%d格式说明符时,编译器会返回使用与 an 相同的位模式int而不是unsigned int. 这就是为什么你仍然得到-10.

如果您想要整数的绝对值,您应该尝试以数学方式获取它,而不是使用强制转换。

于 2011-10-01T04:21:27.577 回答