数据宽度
数据宽度
我们都知道的,一个水杯是有容量的,当你接的水超过了可以容纳的量以后,就会流出来。计算机也是这样,如果存储的数据超过了所能接受的范围,就会选择抛弃一些数据来存储新的数据。这就是数据宽度(可以理解为一个容器)
常见的单位有如下几个:
-
位
Bit
只存一位二进制 -
字节
Byte
可存储八位二进制0~FF
-
字
Word
可存储十六位二进制0~FFFF
-
双字
Dword
可存储三十二位二进制0~FFFFFFFF
日常使用计算机时,最经常看到的就是字节。
数据溢出
一个整数型为4个字节,我们定义超出了四个字节,可以发现超出的部分A
没有了
总结:如果数据超出存储范围,抛弃左边的数据
有无符号数
0代表的是正数。正数的计数规则和无符号数是一样的
这里的0或1开头,是转成二进制看的,十六进制1转成二进制是0001,所以是0开头。
如果是一个负数呢?
原码、反码、补码
正数的原码=反码=补码,不作讨论
我们以负数1000 1011
为例
# 原码
绝对值本身,也就是 1000 1011
# 反码
符号位不变,其余位置取反,也就是 1111 0100
# 补码
符号位不变,其余位置取反,取反完成后+1,也就是 1111 0101
负数在内存中的存储
如上图所示,-1在内存中为FF,那么它是以什么形式存储的呢?
原码:-1转换为二进制为1000 0001
,16进制为81
反码:原码除去符号位1,其余位取反,1111 1110
,16进制为FE
补码:原码除去符号位1,其余位取反,再+1,1111 1111
,16进制为FF
结论:负数在内存中以补码形式存储。
数据类型
进制
0x代表十六进制
0b代表二进制
0代表八进制
整数型
范围
范围:-2^31-2^31-1 -2147483648-2147483647
声明
int 32位
short int 16位 输出使用%hd、%ho、%hx,下面同理
long int 32位 输出使用%ld
long long int 64位 输出使用%lld
输出十进制、八进制、十六进制
int num=1;
printf("%d %o %x", num, num, num); //%d
short int num=1;
printf("%hd %ho %hx", num, num, num); //%hd
long int num=1;
printf("%ld %lo %lx", num, num, num); //%ld
long long num=1;
printf("%lld %llo %llx", num, num, num); //%lld
无符号
unsigned 无符号
unsigned int 就是只有正数 输出使用%u
字符型
//char
理论上为8字节,ascii码范围为0-127
后来有了unicode,16位、32位
声明,注意不能使用双引号
//这里不能用双引号,因为双引号定义的是字符串
char name='A';
输出
//输出 %c
printf("%c", name);
浮点数
float 单精度浮点型 32位
double 双精度浮点型 64位
定义使用小数点或科学技术法
//定义
float num = 1.1;
double num2 = 12E-5;
输出使用%f
//输出 %f
prinf("%f %f",num, num2)
其他数据类型
HANDLE 句柄(智能指针)
句柄(Handle)是一个是用来标识对象或者项目的标识符,可以用来描述窗体、文件等,值得注意的是句柄不能是常量。
Windows之所以要设立句柄,根本上源于内存管理机制的问题,即虚拟地址。简而言之数据的地址需要变动,变动以后就需要有人来记录、管理变动,因此系统用句柄来记载数据地址的变更。在程序设计中,句柄是一种特殊的智能指针,当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。
简介
句柄(handle)是C++程序设计中经常提及的一个术语。它并不是一种具体的、固定不变的数据类型或实体,而是代表了程序设计中的一个广义的概念。句柄一般是指获取另一个对象的方法——一个广义的指针,它的具体形式可能是一个整数、一个对象或就是一个真实的指针,而它的目的就是建立起与被访问对象之间的唯一的联系。
在C++中,要访问一个对象,通常可以建立一个指向对象的指针。但是在很多具体的应用中,直接用指针代表对象并不是一个好的解决方案
对象.
句柄是Windows系统中对象或实例的标识,这些对象包括模块、应用程序实例、窗口、控制、位图、GDI对象、资源、文件等
数据类型.
从数据类型上来看,它只是一个16位的无符号整数。应用程序总是通过调用Windows API获得一个句柄,之后其他 Windows函数就可以使用该句柄,以引用和操作相应的内核对象。句柄可以像指针那样置空,那样句柄就没有任何意义,不代表任何内核对象
使用.
句柄在 Windows编程中是一个很重要的概念,在 Windows程序中并不是用物理地址来标识一个内存块、文件、任务或动态装入模块的。相反地,Windows API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。
应该明白的是,句柄是一个标识符,是用来标识对象或者项目的。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个Windows函数来获得一个句柄,之后其他的Windows函数就可以使用该句柄,以引用相应的对象。在 Windows编程中会用到大量的句柄。
LPVOID(没有类型的指针)
LPVOID是一个没有类型的指针,也就是说你可以将任意类型的指针赋值给LPVOID类型的变量(一般作为参数传递),然后在使用的时候在转换回来
WINAPI
其实WINAPI是C语言中的一种调用方式,WINAPI是一个宏,所代表的符号是__stdcall
, 函数名前加上这个符号表示这个函数的调用约定是标准调用约定,windows API函数采用这种调用约定。
什么时候使用WINAPI宏定义?
1.在程序中需要调用WindowsAPI的方法时,有些方法的接口声明和定义会用到WINAPI宏。
2.在编写Windows应用程序时(如C编写windows窗口程序),其中调用的函数声明和定义时需要加上WINAPI宏。
3.在进行C++thread多线程编程时线程调用的程序必须以下列形式声明:
DWORD WINAPI 函数名 (LPVOID lpParam) ,格式不正确将无法调用成功。
DWORD
32位无符号整数,DWORD 一般用于返回值不会有负数的情况。
使用
① DWORD在Windows下经常用来保存地址(或者存放指针)。
② 使用时应该添加如下文件包含#include<windows.h> 。
typedef
起别名
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;