unsigned int类型函数返回负数
Function of type unsigned int returns negative number
哇,我以为我知道我的c++,但这是奇怪的
这个函数返回一个unsigned int所以我认为这意味着我永远不会得到一个负数返回对吗?
该函数确定您比UTC早或晚几个小时。对我来说,我在澳大利亚悉尼,所以我是+ 10gmt,这意味着我是UTC = LocalTime +(-10)。因此,GetTimeZoneInformation正确地确定我是-10。
但是我的函数返回一个unsigned int,所以它不应该返回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: %dn"), getTimeZoneBias()); // this prints out A: -10
debugLog += _T("Bias: ") + tstring(ch) + _T("rn");
您正在尝试将unsigned int
打印为signed int
。将%d
改为%u
_stprintf( ch, _T("A: %un"), getTimeZoneBias());
^
问题是,对于大多数计算机来说,整数本身既不是正的也不是负的。
所以一个大整数可能与一个小的(绝对值)负整数难以区分
我认为是这样的:
tzInfo.Bias
的值实际上是-10。( 0xFFFFFFF6
)在大多数系统中,将有符号整数转换为相同大小的无符号整数对表示形式没有任何影响。
所以函数仍然返回0xFFFFFFF6
。
但是当你输出它的时候,你输出的是一个有符号整数。所以它输出-10
。如果你把它打印成一个无符号整数,你可能会得到4294967286
。
你可能想要做的是得到时差的绝对值。所以要把-10变成10。其中应该返回abs(tzInfo.Bias / 60)
。
一个错误是在您的_T
呼叫。应该是:
_T("A: %un")
函数返回一个非负整数。但是,如果使用了错误的printf说明符,就会导致它以整数形式从堆栈中弹出。换句话说,比特被解释错了。我相信这也是未定义行为
正如其他人指出的那样,当您强制转换为unsigned int
时,您实际上是告诉编译器使用int
中的位模式并将其用作unsigned int
。如果您的计算机像大多数计算机一样使用二进制补码,那么您的数字将被解释为UINT_MAX-10
而不是您期望的10
。当您使用%d
格式说明符时,编译器会返回使用与int
相同的位模式,而不是unsigned int
。这就是为什么你仍然得到-10
。
如果你想要一个整数的绝对值,你应该尝试用数学方法来得到它,而不是使用强制类型转换。
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 接收和返回函数指针的函数指针的类型?
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- C++函数链返回函数
- 返回函数指针的函数的签名
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- 非常量引用返回函数在常量值返回函数上用作 r 值
- 如何在 C++ 中从 void 返回函数访问变量
- 返回函数中带有 2 个可选 ctor 的对象
- 如何在 c++ 中返回函数的结构向量
- 返回 C++ 函数中的引用
- 使用向量时,当返回函数更改时,无法看到输出
- 如何在递归中使用返回函数
- 返回函数模板的类型C++作为第二个模板参数
- 为什么静态指针返回函数中有一个"静态"键?
- 递归返回函数,在特殊情况下不返回
- 从类返回函数
- 从类成员函数返回函数指针
- 从返回函数中推断不存在的模板参数