参考资料:
(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还提供了许多结构体类型,如`TABC`、`TAccel`等,这些结构体在C/C++中有对应的类型,例如: - **TABC (C/C++中的TABC)** - **TAccel (C/C++中的TAccel)** - **TAtom (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++ ...
基本数据类型是编程语言中最基本的数据类型,是构成复杂数据类型的基础。C/C++语言的操作符具有优先级,正确理解操作符的优先级是编写正确程序的关键。ASCII码表是计算机中字符编码的一种标准,它将不同的字符映射为...
C语言作为基础的编程语言,其函数库丰富多样,从基本的数据类型操作到复杂的内存管理,都有一系列的函数支持。例如,`printf`用于格式化输出,`scanf`用于从标准输入读取数据,`malloc`和`free`分别用于动态内存分配...
1. **基本语法**:变量声明、数据类型(如int、char、float等)、运算符、流程控制(如if、switch、for、while循环)。 2. **函数**:定义、调用、参数传递、递归函数。 3. **指针**:理解指针的本质,如何声明、...
6. **C库的C++封装**:C++对C库中的函数进行了封装,如头文件和分别对应C语言的和,使得C++代码能以更现代的方式来使用这些函数。 7. **C++11及后续版本的新特性**:从C++11开始,C++引入了一系列新特性,如lambda...
"C语言教室.chm"和"C语言资料大全.chm"可能包含了C语言的基本语法、控制结构、数据类型、函数、指针等内容,这些都是学习C语言的必备知识。"c语言编程宝典之一.chm"可能更侧重于实践,提供了大量实例帮助读者巩固所...
这个"android C/C++ JNI普通数据类型 测试工程"是用于演示如何在C/C++与Java之间传递和操作基本数据类型的一个实例。在本文中,我们将深入探讨JNI中的数据类型转换以及如何在C/C++代码和Java代码之间使用它们。 ...
基本数据类型 关键字 标准 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++数据类型,从而避免了类型不匹配的问题。例如,数据库中的VARCHAR2类型会被映射为C/C++中的char*类型。 #### 三、Oracle Pro*C/C++与数据库的连接 **3.1 连接...
"c/c++ 数据结构"这一主题涵盖了从基本到高级的各种数据结构类型,包括数组、链表、栈、队列、树、图以及哈希表等。 数组是最基础的数据结构,它是一系列相同类型的元素集合,可以通过索引访问。C/C++中的数组操作...
在C语言部分,学习者将接触到基本的数据类型、变量、运算符、流程控制(如if语句、循环)、函数、数组和指针等内容。指针是C语言的一大特色,理解其工作原理对于优化内存管理和提高程序性能至关重要。同时,通过编写...
首先,C语言部分会涵盖基本语法,包括变量声明、数据类型(如int、char、float等)、运算符、控制结构(如if-else、switch-case、for、while循环)、函数定义与调用、指针操作等。这些基础知识构成了C语言的骨架,是...
《C/C++参考手册》是一份综合性的编程指南,涵盖了C和C++这两种语言的各个方面。这份手册特别强调了最新的C++11、C++14以及C++17标准的特性,旨在帮助开发者深入理解和有效利用这些现代C++语言的新功能。 C语言部分...
1. **基础知识**:讲解C/C++的基本语法,如变量、数据类型、运算符、流程控制语句(如if、switch、for、while等),以及函数的定义与调用。 2. **指针与内存管理**:C/C++中的指针是其强大之处,也是初学者的难点。...
1. **基础语法**:包括变量、数据类型、运算符、流程控制(如if-else、switch-case、循环)、函数、指针等。对于指针,理解其工作原理、内存管理以及如何使用指针进行动态内存分配和释放至关重要。 2. **预处理器和...
C/C++参考手册是专为C语言开发者制作的一个学习文档,包含了基本的介绍、预处理命令、算法、正则表达式、转义字符、基本数据类型等介绍,可以方便开发者快速掌握C语言的开发技巧,让你轻松开发出满意的软件。
对于初学者而言,了解C语言的基本语法和数据类型是学习C++的前提。 1. **C语言基础知识**:C语言的学习通常从变量、数据类型、运算符和表达式开始。变量是用来存储数据的容器,数据类型包括整型、浮点型、字符型等...
- 指针是C/C++中的一个特殊类型,它存储了一个变量的内存地址。 - 指针变量需要先声明,再分配内存,然后才能通过解引用操作访问其所指向的值。 - C++中提供了三种基本类型的指针:普通指针、常量指针和指针常量...
《C语言学习和精华文摘.chm》是一个综合性的学习资料,可能包含C语言的基本语法、数据类型、控制结构、指针、内存管理等多个主题的概述和精选内容。它是学习C语言的宝贵资源,有助于读者系统性地掌握C语言的基础知识...