c++高级---C++主要数据类型在计算机中所占字节大小

本文详细介绍了C++中整型、布尔型、字符型、浮点型等数据类型的大小及特性,在32位Windows系统上的具体实现,并通过代码验证了各数据类型在内存中的占用情况。

转自:http://www.cnblogs.com/Romi/archive/2012/01/09/2317059.html

遇到了数据存储的大端和小端问题,这你妹的看的一头雾水,发现我基本知识严重匮乏啊,先了解C++各数据类型在自己机子上占多少字节吧,以及这些数据类型所占字节大小与神马有关。各种查资料然后写代码检验,小结于本文中,给自己补补基础知识。

先来列一下C++的数据类型:

整型:int,long。这两个还分signed(有符号)和unsigned(无符号)的,当然有符号和无符号所占字节大小是一样的,就不管他了。

布尔型:bool        

字符型:char,wchar_t

浮点型:float,double

这只能上代码验证了,貌似机子不同数据类型所占大小也不同,太威武了,我就检查下我这个32位windows系统电脑吧。我用的IDE是Code::Blocks,发现挺好用的,主要是工程文件小,不像vs2010建个工程就大得很,哥这小硬盘吃不消啊(题外话)。

先看整型的吧,代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
int main()
{
    int a;
    long b;
    int Byteof_int= sizeof (a);
    int Byteof_long= sizeof (b);
    cout << "int:" <<Byteof_int<<endl;
    cout << "long:" <<Byteof_long<<endl;
    return 0;
}

结果显示:

int:4

long:4

int和long都是占4个字节(即32位)。

其他数据类型验证吧上面代码数据类型替换下就是了,得出下面的结果:

bool:1

char:1

wchar_t:2

float:4

double:8

特别要注意的时,对于指针类型,都占4个字节,因为指针指向的是一个地址,32位操作系统就是4字节。当然如果是64位操作系统那就是8字节了。

此外,int这个类型占操作系统一个内存单元大小。早先16位操作系统一个内存单元是64位,所以是2个字节;32位系统一个内存单元是是32位,所以是4字节;64位操作系统一个内存单元是16位,故占8个字节。

因为用到MFC编程,mfc里还有很多数据类型啊,看看吧(这只是一部分,还有很多用typedef和宏定义的类型)。

BOOL:int型,Boolean值(TRUE or FALSE)

BSTR:32-bit字符指针

BYTE:8-bit整数,无正负号

COLORREF:32-bit数值,代表一个颜色值

DWORD:32-bit整数,无正负号

LONG:32-bit整数,有正负号

LPARAM:32-bit数值,作为窗口函数或callback函数的一个参数

LPCSTR:32-bit指针,指向一个常数字符串

LPSTR:32-bit指针,指向一个字符串

LPCTSTR:32-bit指针,指向一个常数字符串。此字符串可移植到Unicode

LPTSTR:32-bit指针,指向一个字符串。此字符串可移植到Unicode

LPVOID:32-bit指针,指向一个未指定类型的数据

LPRESULT:32-bit数值,作为窗口函数或callback函数的返回值

UINT:Win16中,16-bit无正负号,Win32中,32-bit无正负号

WNDPROC:32-bit

WORD:16-bit整数,无正负号

WPARAM:窗口函数的一个参数,Win16中16bits,Win32中32bits

 

<think>我们已知用户询问C++中不同类型所字节大小,并且用户提供了三个引用来源。根据引用内容,我们可以总结如下: 引用[1]和引用[2]主要讨论了不同位数编译器(16位、32位、64位)下基本数据类型字节数,并指出指针类型的大小随编译器位数变化。 引用[3]则通过一个代码示例说明指针所内存空间的大小(在64位编译器下为8字节),并指出指针大小不随数据类型变化。 根据这些引用,我们可以整理出如下表格: 注意:以下表格中,对于不同的编译器位数,我们分别列出16位、32位、64位下的字节数。但需要注意的是,C++标准并没有明确规定每种类型的具体大小,只规定了最小大小和相对大小关系(如引用[2]中提到的原则)。因此,实际大小可能因编译器和平台而异。 表格内容: 类型 | 16位编译器 | 32位编译器 | 64位编译器 ---------------|-----------|-----------|----------- char | 1 | 1 | 1 char* (指针) | 2 | 4 | 8 short int | 2 | 2 | 2 int | 2 | 4 | 4 unsigned int | 2 | 4 | 4 float | 4 | 4 | 4 double | 8 | 8 | 8 long | 4 | 4 | 8 long long | 8 | 8 | 8 unsigned long | 4 | 4 | 8 另外,引用[3]还强调了指针类型的大小:在64位编译器下,任何类型的指针都是8字节(因为64位系统的寻址空间是64位,即8字节)。 我们还可以补充一些常见类型,如bool、wchar_t等,但引用中未提及,因此我们可以根据常见情况补充(但需要注明并非来自引用): 类型 | 16位编译器 | 32位编译器 | 64位编译器 ---------------|-----------|-----------|----------- bool | 1 (通常) | 1 (通常) | 1 (通常) wchar_t | 2 (通常) | 4 (通常) | 4 (通常) [注意:wchar_t的大小由编译器决定] 注意:wchar_t在Windows系统中一般为2字节(UTF-16),在Linux系统中一般为4字节(UTF-32)。因此,实际大小依赖于系统和编译器。 另外,结构体(struct)的大小则涉及内存对齐,所以不一定等于各成员大小之和。 回答时,我们将主要依据引用内容给出表格,并补充说明一些常见情况。同时,我们需要提醒用户,实际大小可以通过`sizeof`运算符在编译时获取。 最后,按照要求生成相关问题。 </think>### C++ 基本数据类型字节大小详解 在 C++ 中,数据类型字节数受编译器位数(16/32/64 位)和操作系统影响[^1][^2]。以下为不同编译环境下的字节数汇总表: | **数据类型** | **16 位编译器** | **32 位编译器** | **64 位编译器** | |--------------------|-----------------|-----------------|-----------------| | `char` | 1 字节 | 1 字节 | 1 字节 | | `char*` (指针) | 2 字节 | 4 字节 | **8 字节** | | `short int` | 2 字节 | 2 字节 | 2 字节 | | `int` | 2 字节 | 4 字节 | 4 字节 | | `unsigned int` | 2 字节 | 4 字节 | 4 字节 | | `float` | 4 字节 | 4 字节 | 4 字节 | | `double` | 8 字节 | 8 字节 | 8 字节 | | `long` | 4 字节 | 4 字节 | **8 字节** | | `long long` | 8 字节 | 8 字节 | 8 字节 | | `unsigned long` | 4 字节 | 4 字节 | **8 字节** | #### 关键规则: 1. **指针大小**: - 由寻址空间决定: - 16 位寻址空间 $2^{16} = 65,536$ → 2 字节[^2] - 32 位寻址空间 $2^{32} = 4.29e9$ → 4 字节 - 64 位寻址空间 $2^{64}$ → 8 字节(任何指针类型均 8 字节)[^3] - 示例:`sizeof(char*)`、`sizeof(int*)` 在 64 位系统均为 8 字节[^3]。 2. **基本规则(ANSI/ISO)**: - $\text{sizeof(short int)} \leq \text{sizeof(int)}$ - $\text{sizeof(int)} \leq \text{sizeof(long int)}$ - `short int` ≥ 2 字节,`long int` ≥ 4 字节[^2]。 3. **结构体内存对齐**: ```cpp typedef struct _node { char c1; // 1 字节 char c2; // 1 字节 char c3; // 1 字节 long long i1; // 8 字节(64 位系统) } node; // 总大小 ≠ 1+1+1+8=11(实际为 16 字节,因内存对齐) ``` #### 如何验证字节大小? 使用 `sizeof` 运算符: ```cpp #include <iostream> int main() { std::cout << "int: " << sizeof(int) << " bytes\n"; // 输出 4(64 位) std::cout << "double*: " << sizeof(double*) << " bytes"; // 输出 8(64 位) return 0; } ``` > ⚠️ **注意**:实际大小可能因编译器实现而异(如 GCC 与 MSVC),建议用 `sizeof` 直接验证[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值