C语言中数据类型的长度以及作用值域
类型标识符 | 类型说明 | 长度 (字节) | 范围 | 备注 |
char | 字符型 | 1 | -128 ~ 127 | -27 ~ (27 -1) |
unsigned char | 无符字符型 | 1 | 0 ~ 255 | 0 ~ (28 -1) |
short int | 短整型 | 2 | -32768 ~ 32767 | 2-15 ~ (215 - 1) |
unsigned short int | 无符短整型 | 2 | 0 ~ 65535 | 0 ~ (216 - 1) |
int | 整型 | 4 | -2147483648 ~ 2147483647 | -231 ~ (231 - 1) |
unsigned int | 无符整型 | 4 | 0 ~ 4294967295 | 0 ~ (232-1) |
float | 实型(单精度) | 4 | 1.18*10-38 ~ 3.40*1038 | 7位有效位 |
double | 实型(双精度) | 8 | 2.23*10-308 ~ 1.79*10308 | 15位有效位 |
long double | 实型(长双精度) | 10 | 3.37*10-4932 ~ 1.18*104932cstring转为int | 19位有效位 |
一个指针本身占用4个字节
unsigned 用于修饰 int 和 char 类型。它使int 或 char 类型成为无符号类型。
signed 是 unsigned 反义词,如 signed int 表示有符号类型,不过signed可以省略,所以上面列出char,short int,int 都是有符号类型。
有 short int (短整型) ,所以也就有对应 long int (长整型)。long int 用于表示4个字节(32位)的整数。但是在我们现在普通使用的32位计算机中,int 默认就是4个字节,所以long也是可以省略的。
(较早几年,也就是Windows 3.1/DOS 流行的时候,那时的机器及操作系统都是16位的,这种情况下,int 默认是16位的。此时,如果想实现32位整数,就必须定义为这样的类型:long int)。
在浮点数方面,我们最常用的将是 double。它的精度适合于我们日常中的各种运算。当然,float的精度也在很多情况下也是符合要求的。
布尔型(bool)和无类型(void)
除字符型,整型,实型以外,布尔型和无类型也是较常用的两种数据类型。
布尔型(bool)
布尔类型是C++的内容,C语言没有这一类型。
布尔类型的数据只有两种值:true(真) 或 false(假)。
什么时候使用布尔型呢?
履历表中一般有“婚否”这一项,婚否这种数据就适于用真或假来表示。性别男女,有时也会用布尔值表示,(一般程序都不约而同地把男性设置“真”,女性设置为“假”。)
无类型(void)
这个类型比较怪“无”类型。是的,没有类型的类型。或者我们这样认为比较好接受:在不需要明确指定类型的时候,我们可能使用 void 来表示。
=========================================================================================
=========================================================================================
=========================================================================================
Visual C++常用数据类型转换详解
本文将介绍一些常用数据类型的使用。
我们先定义一些常见类型变量借以说明
int i = 100;
long l = 2001;
float f=300.2;
double d=12345.119;
char username[]="女侠程佩君";
我们先定义一些常见类型变量借以说明
int i = 100;
long l = 2001;
float f=300.2;
double d=12345.119;
char username[]="女侠程佩君";
char temp[200];
char *buf;
CString str;
_variant_t v1;
_bstr_t v2;
一、其它数据类型转换为字符串
短整型(int)
itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制
itoa(i,temp,2); ///按二进制方式转换
长整型(long)
ltoa(l,temp,10);
char *buf;
CString str;
_variant_t v1;
_bstr_t v2;
一、其它数据类型转换为字符串
短整型(int)
itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制
itoa(i,temp,2); ///按二进制方式转换
长整型(long)
ltoa(l,temp,10);
二、从其它包含字符串的变量中获取指向该字符串的指针
CString变量
str = "2008北京奥运";
buf = (LPSTR)(LPCTSTR)str;
BSTR类型的_variant_t变量
v1 = (_bstr_t)"程序员";
buf = _com_util::ConvertBSTRToString((_bstr_t)v1);
三、字符串转换为其它数据类型
strcpy(temp,"123");
短整型(int)
i = atoi(temp);
长整型(long)
l = atol(temp);
浮点(double)
d = atof(temp);
四、其它数据类型转换到CString
使用CString的成员函数Format来转换,例如:
整数(int)
str.Format("%d",i);
浮点数(float)
str.Format("%f",i);
字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值
长整型(long)
l = atol(temp);
浮点(double)
d = atof(temp);
四、其它数据类型转换到CString
使用CString的成员函数Format来转换,例如:
整数(int)
str.Format("%d",i);
浮点数(float)
str.Format("%f",i);
字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值
str = username;
五、BSTR、_bstr_t与CComBSTR
CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。
char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h
反之可以使用char *p=_com_util::ConvertBSTRToString(b);
六、VARIANT 、_variant_t 与 COleVariant
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
五、BSTR、_bstr_t与CComBSTR
CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。
char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h
反之可以使用char *p=_com_util::ConvertBSTRToString(b);
六、VARIANT 、_variant_t 与 COleVariant
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
VARIANT va;
int a=2001;
va.vt=VT_I4;///指明整型数据
va.lVal=a; ///赋值
对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
unsigned char bVal; VT_UI1
short iVal; VT_I2
long lVal; VT_I4
float fltVal; VT_R4
double dblVal; VT_R8
VARIANT va;
int a=2001;
va.vt=VT_I4;///指明整型数据
va.lVal=a; ///赋值
对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
unsigned char bVal; VT_UI1
short iVal; VT_I2
long lVal; VT_I4
float fltVal; VT_R4
double dblVal; VT_R8
VARIANT_BOOL boolVal; VT_BOOL
SCODE scode; VT_ERROR
CY cyVal; VT_CY
DATE date; VT_DATE
BSTR bstrVal; VT_BSTR
IUnknown FAR* punkVal; VT_UNKNOWN
IDispatch FAR* pdispVal; VT_DISPATCH
SAFEARRAY FAR* parray; VT_ARRAY|*
unsigned char FAR* pbVal; VT_BYREF|VT_UI1
short FAR* piVal; VT_BYREF|VT_I2
long FAR* plVal; VT_BYREF|VT_I4
float FAR* pfltVal; VT_BYREF|VT_R4
double FAR* pdblVal; VT_BYREF|VT_R8
VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL
SCODE FAR* pscode; VT_BYREF|VT_ERROR
SCODE scode; VT_ERROR
CY cyVal; VT_CY
DATE date; VT_DATE
BSTR bstrVal; VT_BSTR
IUnknown FAR* punkVal; VT_UNKNOWN
IDispatch FAR* pdispVal; VT_DISPATCH
SAFEARRAY FAR* parray; VT_ARRAY|*
unsigned char FAR* pbVal; VT_BYREF|VT_UI1
short FAR* piVal; VT_BYREF|VT_I2
long FAR* plVal; VT_BYREF|VT_I4
float FAR* pfltVal; VT_BYREF|VT_R4
double FAR* pdblVal; VT_BYREF|VT_R8
VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL
SCODE FAR* pscode; VT_BYREF|VT_ERROR
CY FAR* pcyVal; VT_BYREF|VT_CY
DATE FAR* pdate; VT_BYREF|VT_DATE
BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR
IUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN
IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH
SAFEARRAY FAR* FAR* pparray; VT_ARRAY|*
VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANT
void FAR* byref; VT_BYREF
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:
long l=222;
ing i=100;
DATE FAR* pdate; VT_BYREF|VT_DATE
BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR
IUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN
IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH
SAFEARRAY FAR* FAR* pparray; VT_ARRAY|*
VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANT
void FAR* byref; VT_BYREF
_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:
long l=222;
ing i=100;
_variant_t lVal(l);
lVal = (long)i;
COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
COleVariant v3 = "字符串", v4 = (long)1999;
CString str =(BSTR)v3.pbstrVal;
long i = v4.lVal;
七、其它
对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:
LPARAM lParam;
lVal = (long)i;
COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
COleVariant v3 = "字符串", v4 = (long)1999;
CString str =(BSTR)v3.pbstrVal;
long i = v4.lVal;
七、其它
对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:
LPARAM lParam;
WORD loValue = LOWORD(lParam);///取低16位
WORD hiValue = HIWORD(lParam);///取高16位
对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:
WORD wValue;
BYTE loValue = LOBYTE(wValue);///取低8位
BYTE hiValue = HIBYTE(wValue);///取高8位
WORD hiValue = HIWORD(lParam);///取高16位
对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:
WORD wValue;
BYTE loValue = LOBYTE(wValue);///取低8位
BYTE hiValue = HIBYTE(wValue);///取高8位
=========================================================================================
=========================================================================================
=========================================================================================
unsigned char
单字节
0~255
signed char
unsigned char
单字节
0~255
signed char
单字节
-128~+127
unsigned int
双字节
0~65535
signed int
双字节
-32768~+32767
unsigned long
四字节
0~4294967295
-128~+127
unsigned int
双字节
0~65535
signed int
双字节
-32768~+32767
unsigned long
四字节
0~4294967295
signed long
四字节
-2147483648~+2147483647
float
四字节
±1.175494E-38~±3.402823E+38
c++ 基本数据类型长度(vc6.0 32位机; 字节为单位
size of int is: 4
size of char is: 1
size of short int is: 2
size of double is: 8
size of unsigned int is: 4
四字节
-2147483648~+2147483647
float
四字节
±1.175494E-38~±3.402823E+38
c++ 基本数据类型长度(vc6.0 32位机; 字节为单位
size of int is: 4
size of char is: 1
size of short int is: 2
size of double is: 8
size of unsigned int is: 4
size of float is: 4
size of long double is: 8
size of long int is: 4
size of long int is: 4
size of unsigned char is: 1
size of signed char is: 1
size of unsigned long int is: 4
size of signed int is: 4
size of unsigned short int is: 2
size of signed short int is: 2
size of signed int is: 4
size of signed long int is: 4
sizeof 指针 is 4;
再细致和规范点
1、 字符型char:一个字节表示,通常表示单个字符或小整数,字符型常量用一对单引号‘ ’
size of long double is: 8
size of long int is: 4
size of long int is: 4
size of unsigned char is: 1
size of signed char is: 1
size of unsigned long int is: 4
size of signed int is: 4
size of unsigned short int is: 2
size of signed short int is: 2
size of signed int is: 4
size of signed long int is: 4
sizeof 指针 is 4;
再细致和规范点
1、 字符型char:一个字节表示,通常表示单个字符或小整数,字符型常量用一对单引号‘ ’
夹着一个字符表示。
(1)可打印字符常量表示:
‘a’ ‘2’ ‘,’ ‘ ’
字符常量在内存中的存储格式依赖于ASCП码表的。
(2)不可打印字符常量,通过斜杠“\”表示:
‘\n’ 换行符 ‘\\’ 反斜杠 ‘\t’ 水平制表符 ‘\0’ 空(NULL)字符
2、 整型int:一个机器字长度的整数值。 (这个概念很重要!!不是定长,而是机器决定)
短整型short:半个机器字长度的整数值。
长整型long:一个或两个机器字长度的整数值。
在32位机器中,int和long通常相同。
(1)上面提到的char字符型,也可看作长度为一个字节的字符型整数。
常用的部分 Windows 数据类型
(1)可打印字符常量表示:
‘a’ ‘2’ ‘,’ ‘ ’
字符常量在内存中的存储格式依赖于ASCП码表的。
(2)不可打印字符常量,通过斜杠“\”表示:
‘\n’ 换行符 ‘\\’ 反斜杠 ‘\t’ 水平制表符 ‘\0’ 空(NULL)字符
2、 整型int:一个机器字长度的整数值。 (这个概念很重要!!不是定长,而是机器决定)
短整型short:半个机器字长度的整数值。
长整型long:一个或两个机器字长度的整数值。
在32位机器中,int和long通常相同。
(1)上面提到的char字符型,也可看作长度为一个字节的字符型整数。
常用的部分 Windows 数据类型
WORD 16位无符号整数
LONG 32位有符号整数
DWORD 32位无符号整数
HANDLE句柄 32位整数
UINT 32位无符号整数
BOOL 布尔
LPTSTR 指向字符串的32位指针
LPCTSTR 指向字符串常量的32位指针
HPARAM 32位消息参数 int
LPARAM 32位消息参数 int
WPARAM 32位消息参数 int
HINSTANCE 实例句柄 int
HDC 设备描述表句柄 int
HWM 窗口句柄 int
LONG 32位有符号整数
DWORD 32位无符号整数
HANDLE句柄 32位整数
UINT 32位无符号整数
BOOL 布尔
LPTSTR 指向字符串的32位指针
LPCTSTR 指向字符串常量的32位指针
HPARAM 32位消息参数 int
LPARAM 32位消息参数 int
WPARAM 32位消息参数 int
HINSTANCE 实例句柄 int
HDC 设备描述表句柄 int
HWM 窗口句柄 int
关于char,tchar,wchar
tchar 在unicode下是wchar(双字符)
而普通是char
char在两者都是char
一般导入一些文件名之类操作时,爱用tchar稳妥.
常用的windows宏定义
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
tchar 在unicode下是wchar(双字符)
而普通是char
char在两者都是char
一般导入一些文件名之类操作时,爱用tchar稳妥.
常用的windows宏定义
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论