`

C/C++基本数据类型

 
阅读更多

参考资料:

(1) 64位与32位编程的数据类型区别(C/C++): http://blog.csdn.net/harbinzju/article/details/5785024

(2) 指针运算: http://blog.csdn.net/hbuxiaoshe/article/details/5785575

 

 

C/C++仅仅定义了这些基本数据类型之间的关系,并没有定义严格定义它们的字长。在不同的平台上,根据编译器不同的实现,它们的字长如下表所示:

数据类型

LP64

ILP64

LLP64

ILP32

LP32

char

8

8

8

8

8

short

16

16

16

16

16

_int32

N/A

32

N/A

N/A

N/A

int

32

64

32

32

16

long

64

64

32

32

32

long long

N/A

N/A

64

N/A

N/A

pointer

64

64

64

32

32

 

在这张表中,LP64,ILP64,LLP64是64位平台上的字长模型,ILP32和LP32是32位平台上的字长模型。

 

LP64意思是long和pointer是64位,ILP64指 int,long,pointer是64位,LLP指long long和pointer是32-bit的。ILP32指int,long和pointer是32位的,LP32指long和pointer是32位的。

 

32位Windows采用的是ILP32数据模型,64位Windows采用的是LLP64数据模型。

 

所以,Windows上的32位程序设计和64位程序设计最大的不同(也就是IP32和LLP64的不同),就在于指针的长度不同??由32位变成了64位。

 

Win32 API在很多情况下,都需要将整数转换成指针或者相反。在 32 位的硬件上不会有问题,其中指针的大小和整数的大小是相同的,但在 64 位的硬件上却完全不一样。

 

为此M$搞了个所谓的“多态类型”:

 

对于特定的精度,您可以使用固定精度的数据类型。不管处理器的词大小如何,它们的大小都是一致的。大多数这些类型都在它们的名称中包含精度,可以从下面的表中看出:

表 1. 固定精度的数据类型
类型 定义

DWORD32            

32 位无符号整数

DWORD64

64 位无符号整数

INT32

32 位有符号整数

INT64

64 位有符号整数

LONG32

32 位有符号整数

LONG64

64 位有符号整数

UINT32

无符号 INT32

UINT64

无符号 INT64

ULONG32

无符号 LONG32

ULONG64

无符号 LONG64

 

此外,当您需要数据类型的精度随着处理器词大小变化时,请使用指针精度数据类型。这些类型又称为“多态”数据类型。这些类型通常以 _PTR 后缀结尾,如下面的表格所示:

表 2. 指针精度的数据类型
类型 定义

DWORD_PTR              

指针精度的无符号长类型

HALF_PTR

指针大小的一半。用于包含一个指针和两个小型字段的结构中

INT_PTR

指针精度的有符号整型

LONG_PTR

指针精度的有符号长类型

SIZE_T

指针可以引用的最大字节数。用于必须跨指针的整个范围的计数

SSIZE_T

有符号 SIZE_T

UHALF_PTR

无符号 HALF_PTR

UINT_PTR

无符号 INT_PTR

ULONG_PTR

无符号 LONG_PTR

LPARAM

与 LONG_PTR 为同义词,(在WTypes.h 中定义)

WPARAM

与 UINT_PTR 为同义词,(在 WTypes.h 中定义)

 

通过整数参数传递参数或上下文信息的所有 Win32 API 都更改为使用这些新的类型。

 

此外,还出现了定长指针:POINTER_32和POINTER_64:

 

#define POINTER_32 __ptr32

 

#define POINTER_64 __ptr64

PS:M$DN中说是在Basetsd.h中定义的

 

 

例1:虚函数和64位机上指针操作一个例题讲清

#include <iostream>
//#include <Basetsd.h>
#include <vector>
using namespace std;

/*
	深入理解虚函数实现机制:
	1. vptr(和对象实例的首地址相同) & vtable(属于类的数据)
	2.      p++,p--:指针p移动一个单位,这个单位大小是多少,要看p的数据类型了。如p是一个char型的,则p++移动一个字节,如果有int *p;则p++移动4个字节(默认32位机)。 
	3. 	32bit和64bit机上,int的长度都是32bit
	
		32bit机上,int*长度是32bit
		64bit机上,int*长度是64bit
		
	测试机器:Sam在百度实习时用的64位机器 
*/

typedef void(*Fun)(void);

class Base{
public:
	virtual void f(){cout<<"f()"<<endl;}
private:
	virtual void g(){cout<<"g()"<<endl;}
};

int main(){
	//32bit和64bit机上,int的长度都是32bit 
	cout<<sizeof(int)<<endl;	//4
	
	//32bit机上,int*长度是32bit
	//64bit机上,int*长度是64bit
	cout<<sizeof(int*)<<endl;	//8
	
	Base b;
	int* p1=(int*)*(int*)(&b);
	Fun f=(Fun)(int *)*p1;
	//64位机器上,一个函数指针的长度为64bit;32位置机器上一个函数指针的长度为32bit 
	//Fun g=(Fun)(int *)*(p1+1); ==> 32bit机上这样用 
	Fun g=(Fun)(int *)*(p1+2);
	f();	//f()
	g();	//g()
	
	return 0;
}

 

 

分享到:
评论

相关推荐

    c / c++ / cpp / stl 中文帮助文档手册chm格式下载

    基本数据类型 关键字 标准 C 库: Standard C I/O Standard C String & Character Standard C Math Standard C Time & Date Standard C Memory Other standard C functions C++ C++ I/O C++ ...

    C/C++ 语言参考.chm

    基本数据类型 关键字 标准 C 库: Standard C I/O Standard C String & Character Standard C Math Standard C Time & Date Standard C Memory Other standard C functions C++ C++ I/O C++ Strings C++ ...

    C/C++基本数据类型所占字节数

    关于这个基本的问题,很早以前很清楚了,C标准中并没有具体给出规定那个基本类型应该是多少字节数,而且这个也与机器、OS、编译器有关,比如同样是在32bits的操作系统系,VC++的编译器下int类型为占4个字节;...

    C/C++中文帮助文档

    C/C++参考手册是专为C语言开发者制作的一个学习文档,包含了基本的介绍、预处理命令、算法、正则表达式、转义字符、基本数据类型等介绍,可以方便开发者快速掌握C语言的开发技巧,让你轻松开发出满意的软件。

    C/C++中文帮助文档(cpp)API

    该参考手册专为c语言开发人员设计,涵盖了基本概念、预处理命令、算法、正则表达式、转义字符、基本数据类型等重要内容。它能够为开发者提供便利,让他们更轻松地掌握c语言的开发技巧,从而开发出满意的软件。 c/...

    C/C++函数手册-中文版和英文版

    基本数据类型 关键字 标准 C 库: Standard C I/O Standard C String & Character Standard C Math Standard C Time & Date Standard C Memory Other standard C functions C++ C++ I/O C++ Strings C++ ...

    C++语言概述 数据的输入与输出 基本数据类型和表达式

    2.1 C++语言概述 2.2 基本数据类型和表达式 2.3 数据的输入与输出 2.4 算法的基本控制结构 2.5 自定义数据类型

    C/C++程序员面试指南.杨国祥(带详细书签).pdf

    C、C++语言是IT行业的主流编程语言,也是很多程序员必备的软件基本功,是软件开发行业招聘考查的重点。本书以流行的面试题讲解为主要内容,介绍了C、C++语言基本概念,包括保留字、字符串、指针和引用、结构体、...

    C/C++-数据结构-电话号码查找系统-大学生课设-课程设计

    编译语言:C++ 源程序使用UTF-8编码 需要程序:GNU Make、GNU G++ 编译运行方式: 1. 打开Linux终端 2. 命令行输入make命令,使用Make程序构建程序 3. 命令行输入./Main ,运行 如需Windows的命令行编译运行...

    c/c++帮助文档(库函数)

    基本数据类型 关键字 标准 C 库: Standard C I/O Standard C String & Character Standard C Math Standard C Time & Date Standard C Memory Other standard C functions C++ C++ I/O C++ Strings C++ 标准模板库 ...

    C/C++-数据结构-教室管理系统-课程设计-大学生课设

    系统类型:64 位操作系统,基于 x64 的处理器 软件环境: Windows 10 开发工具: Microsoft Visual Studio Community 2017 编程语言: C++11 已在Windows VS 调测通过 有问题请csdn私信联系我 管理员账户...

    C/C++笔试题(附答案,华为面试题系列)

    (5)可用于基本数据类型 8.CSingleLock是干什么的。 答:同步多个线程对一个数据类的同时访问 9.NEWTEXTMETRIC 是什么。 答:物理字体结构,用来设置字体的高宽大小 10.程序什么时候应该使用线程,什么时候单...

    C++基本数据类型

    C++基本数据类型,以便于同学更好的学习C++,是学习C—++的基础

    matlab与c/c++混合编程中VARIANT与c++数据类型转换类

    主要实现vc与com组件之间数据类型的转换(VARIANT与基本数据类型转换)

    c/c++API和STL库

    c/c++API和STL库 包括预处理命令 、操作符优先级 、转义字符 、ASCII码表 、基本数据类型 、关键字 标准 C 库 C++ 标准模板库

    C和C++编程语言数据类型

    c语言和c++的几种基本语言类型,C语言包含5个基本数据类型: void, integer, float, double, 和 char.

    C/C++API参考文档.zip

    C/C++的全部函数,C++标准模板库,关键字,预处理指令,转义字符,基本数据类型,ASCII码表等 此文档英文原文摘自www.cppreference.com,原名:cpp_ref_ch.chm

    C_C++语言参考.

    基本数据类型 关键字 标准 C 库: Standard C I/O Standard C String & Character Standard C Math Standard C Time & Date Standard C Memory Other standard C functions C++ C++ I/O C++ Strings C++ ...

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

     gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,反之亦然。这样,只用一组简单的API就将用户从SOAP细节实现工作中解脱了出来,可以专注与应用程序逻辑的实现工作了。...

Global site tag (gtag.js) - Google Analytics