2013-11-21 203 views
-3

我正在运行Windows 7(64位)。32位机器与64位机器之间的C/C++:sizeof(short),sizeof(int),sizeof(long),sizeof(long long)等等...

这个问题看这里发现了同样的问题:

long on a 64 bit machine

,但更深入的,因为它有更多的数据类型的交易,适用 C或C++,不C#。首先,我使用的是Microsoft Visual Studio Ultimate 2012. 不幸的是,虽然此IDE支持C#和Visual C++,但它不再支持旧的Visual C似乎。无论如何,我已经试过在IDE中创建下列标准C++程序 :

#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被设定为“字大小”,这是在32位机器16上的16位 机器和32。然而,这条规则似乎打破了64位的 系统,其中人们预计“字大小”为64.相反,从我读过的这些系统看起来像32位系统,但更好地支持 64位系统, bit计算比他们的32位同行做。因此,从上述C++程序获得的结果 与在32位系统上获得的结果 完全相同。数据类型的大小(size_t)(可以使用 来测量内存中的对象占用的内存量) 也将其值存储在4个字节中,并且有趣的是 用于访问存储器的指针大小位置(例如sizeof(void *) 显示用于存储通用指针到存储器中任何位置的位数) 也是32位长。

任何人都知道是怎么来VISAUL下从Visual Studio 2012取出,是否 仍然可能之前如上退出 运行从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

Visual Studio在64位机器上使用[LLP64模型](https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models)。 –

+1

sizeof(int *)对于帮助理解64位机器是一个很好的补充。 –

+9

C支持*被*删除。您在控制台应用程序中看到的情况与您在桌面上为程序创建快捷方式时发生的情况完全相同。闪,爆炸,走了。你必须添加谚语“点击任何键继续”的代码。使用8字节整数会使64位代码非常慢。约束不是处理器,而是内存。在64位模式下速度并不快。只问*一个*问题。 –

回答

1

看起来是对我的。在c/C++中,int不是按照位的大小来定义的。创建项目时,您可以选择“控制台应用程序”。 VS2012仍然支持C语言,但他们大多将项目整合到C/C++中。有一个编译器选项(/ TC我认为)将强制编译器进入C合规性。默认情况下,它将通过文件扩展名暗示语言。 MS C支持并不理想,例如它不包含stdbool.h。

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

+0

是的,这是真的,它不包括stdbool .h,因此甚至不能被认为是一个标准的实现,毕竟这些年来他们还没有解决问题。我猜他们的IDE更关注于C#开发。 –

+2

我不能说MS,但它似乎已修复(最近),请参阅:http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00 -00-65-69/0638.Updated-Conformance-Map.png我认为他们在很长一段时间内在托管代码上花费了大量的时间,但在去年他们似乎重新关注C++。一般来说,你必须与你没有想要的东西一样工作:-) – Dweeberly