`

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;
}

 

 

分享到:
评论

相关推荐

    Delphi 与 C/C++ 数据类型对照表

    除了上述基本数据类型之外,Delphi还提供了许多结构体类型,如`TABC`、`TAccel`等,这些结构体在C/C++中有对应的类型,例如: - **TABC (C/C++中的TABC)** - **TAccel (C/C++中的TAccel)** - **TAtom (C/C++中的...

    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++ 标准库函数 (中文版)

    基本数据类型是编程语言中最基本的数据类型,是构成复杂数据类型的基础。C/C++语言的操作符具有优先级,正确理解操作符的优先级是编写正确程序的关键。ASCII码表是计算机中字符编码的一种标准,它将不同的字符映射为...

    C/C++详细函数大全

    C语言作为基础的编程语言,其函数库丰富多样,从基本的数据类型操作到复杂的内存管理,都有一系列的函数支持。例如,`printf`用于格式化输出,`scanf`用于从标准输入读取数据,`malloc`和`free`分别用于动态内存分配...

    c/c++帮助文档中文

    1. **基本语法**:变量声明、数据类型(如int、char、float等)、运算符、流程控制(如if、switch、for、while循环)。 2. **函数**:定义、调用、参数传递、递归函数。 3. **指针**:理解指针的本质,如何声明、...

    C/C++ API 帮助文档大全(中文,chm格式)

    6. **C库的C++封装**:C++对C库中的函数进行了封装,如头文件和分别对应C语言的和,使得C++代码能以更现代的方式来使用这些函数。 7. **C++11及后续版本的新特性**:从C++11开始,C++引入了一系列新特性,如lambda...

    C语言/C++资料大全(谭浩强)

    "C语言教室.chm"和"C语言资料大全.chm"可能包含了C语言的基本语法、控制结构、数据类型、函数、指针等内容,这些都是学习C语言的必备知识。"c语言编程宝典之一.chm"可能更侧重于实践,提供了大量实例帮助读者巩固所...

    android C/C++ JNI普通数据类型 测试工程

    这个"android C/C++ JNI普通数据类型 测试工程"是用于演示如何在C/C++与Java之间传递和操作基本数据类型的一个实例。在本文中,我们将深入探讨JNI中的数据类型转换以及如何在C/C++代码和Java代码之间使用它们。 ...

    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++ ...

    Oracle 11g Pro C/C++编程艺术

    它能够自动地将数据库中的数据类型转换为对应的C/C++数据类型,从而避免了类型不匹配的问题。例如,数据库中的VARCHAR2类型会被映射为C/C++中的char*类型。 #### 三、Oracle Pro*C/C++与数据库的连接 **3.1 连接...

    c/c++ 数据结构

    "c/c++ 数据结构"这一主题涵盖了从基本到高级的各种数据结构类型,包括数组、链表、栈、队列、树、图以及哈希表等。 数组是最基础的数据结构,它是一系列相同类型的元素集合,可以通过索引访问。C/C++中的数组操作...

    c/c++语言程序设计课件

    在C语言部分,学习者将接触到基本的数据类型、变量、运算符、流程控制(如if语句、循环)、函数、数组和指针等内容。指针是C语言的一大特色,理解其工作原理对于优化内存管理和提高程序性能至关重要。同时,通过编写...

    学习C/C++很好的课件

    首先,C语言部分会涵盖基本语法,包括变量声明、数据类型(如int、char、float等)、运算符、控制结构(如if-else、switch-case、for、while循环)、函数定义与调用、指针操作等。这些基础知识构成了C语言的骨架,是...

    c/c++参考手册

    《C/C++参考手册》是一份综合性的编程指南,涵盖了C和C++这两种语言的各个方面。这份手册特别强调了最新的C++11、C++14以及C++17标准的特性,旨在帮助开发者深入理解和有效利用这些现代C++语言的新功能。 C语言部分...

    达内 C/C++课件 适合初学者

    1. **基础知识**:讲解C/C++的基本语法,如变量、数据类型、运算符、流程控制语句(如if、switch、for、while等),以及函数的定义与调用。 2. **指针与内存管理**:C/C++中的指针是其强大之处,也是初学者的难点。...

    C/C++程序员面试宝典

    1. **基础语法**:包括变量、数据类型、运算符、流程控制(如if-else、switch-case、循环)、函数、指针等。对于指针,理解其工作原理、内存管理以及如何使用指针进行动态内存分配和释放至关重要。 2. **预处理器和...

    C/C++中文帮助文档

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

    C/C++语言参考手册

    对于初学者而言,了解C语言的基本语法和数据类型是学习C++的前提。 1. **C语言基础知识**:C语言的学习通常从变量、数据类型、运算符和表达式开始。变量是用来存储数据的容器,数据类型包括整型、浮点型、字符型等...

    C/C++指针经典资料大全

    - 指针是C/C++中的一个特殊类型,它存储了一个变量的内存地址。 - 指针变量需要先声明,再分配内存,然后才能通过解引用操作访问其所指向的值。 - C++中提供了三种基本类型的指针:普通指针、常量指针和指针常量...

    C/C++学习集锦.rar

    《C语言学习和精华文摘.chm》是一个综合性的学习资料,可能包含C语言的基本语法、数据类型、控制结构、指针、内存管理等多个主题的概述和精选内容。它是学习C语言的宝贵资源,有助于读者系统性地掌握C语言的基础知识...

Global site tag (gtag.js) - Google Analytics