c++ - 为什么使用 int、unsinged int 或 size_t 会产生不同的结果?
问题描述
我在 Windows 10 + VS2017 (15.8.5) 下开发
我的代码如下
#include <iostream>
int main(int argc, char** argv)
{
int i = 65176;
int j = 65224;
int k = 0;
int res[3] = {65536, 65536};
int index_int = i + j * (res[0] + 1) + k * (res[0] + 1)*(res[1] + 1);
unsigned int index_uint = i + j * (res[0] + 1) + k * (res[0] + 1)*(res[1] + 1);
size_t index_sizet = i + j * (res[0] + 1) + k * (res[0] + 1)*(res[1] + 1);
std::cout << "sizeof(int): " << sizeof(index_int) << " - index_int = " << index_int << std::endl;
std::cout << "sizeof(unsigned int): " << sizeof(index_uint) << " - index_uint = " << index_uint << std::endl;
std::cout << "sizeof(size_t): " << sizeof(index_sizet) << " - index_sizet = " << index_sizet << std::endl;
return 0;
}
打印出来
sizeof(int): 4 - index_int = -20316832
sizeof(unsigned int): 4 - index_uint = 4274650464
sizeof(size_t): 8 - index_sizet = 18446744073689234784
int vs unsigned int:由于 an 的范围int
是(-2,147,483,648, 2,147,483,647),因此操作会index_int
溢出限制,因此是负值,unsigned int
与其范围是(0 到 4,294,967,295)相反。
unsigned int vs size_t:但是,我不明白为什么size_t
有一个完全不同的值,我知道它有一个更大的范围,因为它有 64 位。什么或如何进行计算?
解决方案
您的代码具有未定义的行为。在所有情况下,您都会这样做
j * (res[0] + 1)
which 评估为65224 * 65537
which 又是4274585288
。这个值超过了int
a 大小4
可以容纳的值,所以你得到有符号整数溢出,这是未定义的行为。
推荐阅读
- django - Django,对多个查询集进行分页
- azure - 使用 PowerShell 更改 Azure VM 的密码
- rust - 来自另一个字段的字段的结构生命周期
- android - 在我的 Android 应用程序中获取“原因:java.lang.RuntimeException”
- xml - Openssl asn1 编码例程问题 - 将 p7m 解密为 xml
- css - 为什么按钮没有得到我给它的颜色?
- html - 如何对齐项目中的项目
- c# - 结果来自等待 DisplayAlert Xamarin.Forms
- yii2 - 选择/取消选择全部在 Kartik select2 yii2 中不起作用
- npm - Azure DevOps - npm 不可见