C / C ++:32位机器上的sizeof(短),sizeof(int),sizeof(long),sizeof(long long)等...而不是64位机器

时间:2013-11-21 00:22:11

标签: c++ c visual-studio-2012 32bit-64bit

我正在运行Windows 7(64位)。

这个问题看到了同样的问题:

long on a 64 bit machine

但更深入,因为它处理更多的数据类型并适用 到C或C ++,而不是C#。首先,我使用的是Microsoft Visual Studio Ultimate 2012。 不幸的是,虽然这个IDE支持C#和Visual C ++,但它不再支持plain 旧的Visual C似乎。无论如何,我已经尝试过创建以下标准C ++ IDE中的程序:

#include <cstdio>

int main(int argc, char **argv) {

  printf("sizeof(short): %d\n", (int) sizeof(short));

  printf("sizeof(int): %d\n", (int) sizeof(int));

  printf("sizeof(long): %d\n", (int) sizeof(long));

  printf("sizeof(long long): %d\n", (int) sizeof(long long));

  printf("sizeof(size_t): %d\n", (int) sizeof(size_t));

  printf("sizeof(void *): %d\n", (int) sizeof(void *));

  printf("Hit enter to exit.\n");

  char *scannedText;

  scanf("%s", &scannedText);

  return 0;

}

因为我找不到运行控制台应用程序的选项 在“返回0”处放置一个断点声明,以便查看输出 在控制台中。结果是:

sizeof(short): %d\n", 4
sizeof(int): %d\n", 4
sizeof(long): %d\n", 4
sizeof(long long): 8
sizeof(size_t): 4
sizeof(void *): 4
Hit enter to exit.

旧C教科书声明int设置为“字大小”,16位为16 机器和32位机器上的32。然而,这个规则似乎在64位上突破 人们期望“字大小”为64的系统。相反,从什么 我读过这些系统就像32位系统,但有更好的支持 比32位计算机的64位计算。因此,结果 从上面的C ++程序中获得的完全相同 在32位系统上获得。数据类型的大小(size_t)(可以 用于测量内存中对象占用的内存量) 还将其值存储在4个字节中,这也很有趣 用于访问内存位置的指针大小(例如sizeof(void *) 显示用于存储通用指针到内存中任何位置的位数) 也是32位长。

任何人都知道如何从Visual Studio 2012中删除Visaul C以及是否 仍然可以在没有的情况下从Visual Studio 2012运行控制台应用程序 在退出之前必须设置断点或从标准输入读取文本 如上所述,控制台窗口在关闭之前暂停?

此外,我的解释是正确的,还是我有错误的配置 在IDE中,例如,它编译为32位而不是64位 系统?根据其中一张海报,由于我的系统是64位,我应该 看到这里描述的size_t和指针的结果: https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models 但我没有看到这一点。有没有办法重新配置Visual Studio 所以它可能支持64位内存模型,而不是什么 我目前在节目的输出中看到了什么?

感谢。

1 个答案:

答案 0 :(得分:1)

看起来对我来说。在c / c ++中,int没有根据位大小进行具体定义。创建项目时,您可以选择“控制台应用程序”。 VS2012仍然支持C,但它们大多将项目归为C / C ++。有一个编译器选项(/ TC我认为)会强制编译器符合C标准。默认情况下,它将通过文件扩展名表示语言。 MS C支持不理想,例如它不包括stdbool.h。

如果要控制数据的位大小,可以使用包含精确宽度int数据类型的stdint.h。