您的位置:首页 > 编程语言 > C语言/C++

C++数据类型

2011-09-30 12:42 211 查看
C++数据类型基础知识

char :字符类型

int : 整型

float :单精度实型(浮点型)

double : 双精度实型

unsigned : 无符号类型

signed : 有符号类型

  bool : 布尔类型

true : 布尔类型的真值

false : 布尔类型的假值

void : 无类型

sizeof : 取得指定类型的所占用的范围

typedef : 为某种类型取一别名

类型标识符 类型说明 长度(字节)   范围          备注

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*104932  19位有效位

//

C/C++ 数据类型

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

类型 描述

void 空类型

int 整型

float 浮点类型

double 双精度浮点类型

char 字符类型

C++ 定义了另外两个基本数据类型: bool 和 wchar_t.

类型 描述

bool 布尔类型, 值为true 或 false

wchar_t 宽字符类型

类型修饰符

一些基本数据类型能够被 signed, unsigned, short, 和 long 修饰. 当类型修饰符单独使用的时候, 默认的类型是 int. 下表是所有可能出现的数据类型:

bool

char

unsigned char

signed char

int

unsigned int

signed int

short int

unsigned short int

signed short int

long int

signed long int

unsigned long int

float

double

long double

wchar_t

类型大小和表示范围

基本数据类型的大小以及能够表示的数据范围是与编译器和硬件平台有关的. "cfloat" (或者 "float.h") 头文件往往定义了基本数据类型能够表示的数据的最大值和最小值. 你也可以使用 sizeof 来获得类型的大小(字节数) . 然而, 很多平台使用了一些数据类型的标准大小,如. int 和 float 通常占用 32位, char 占用 8位, double 通常占用64位. bools 通常以 8位 来实现.

//

Visual C++常用数据类型转换详解

    我们先定义一些常见类型变量借以说明:

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

  二、从其它包含字符串的变量中获取指向该字符串的指针

  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构造函数支持的数据类型可以直接赋值

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的定义。

  对于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_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

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;

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

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位

//

c/c++ 数据类型转换总结  

    在c/c++中int、float、char等都可以自由转换,但是由于c/c++语言本身根本就没有提供字符串数据类型,因此字符串与其他数据类型的转换就必须通过其提供的库函数来实现,通过对网上相关文章的总结和MSDN的查阅,现总结数值型数据与字符串型数据的转换实现过程如下:

(程序来源:MSDN)

 

一、sscanf与sprintf (stdio.h)

 

Example

/* SSCANF.C: This program uses sscanf to read data items

 * from a string named tokenstring, then displays them.

 */

#include <stdio.h>

void main( void )

{

   char tokenstring[] = "15 12 14...";

   char s[81];

   char c;

   int i;

   float fp;

   /* Input various data from tokenstring: */

   sscanf( tokenstring, "%s", s );

   sscanf( tokenstring, "%c", &c );

   sscanf( tokenstring, "%d", &i );

   sscanf( tokenstring, "%f", &fp );

   /* Output the data read */

   printf( "String = %s\n", s );

   printf( "Character = %c\n", c );

   printf( "Integer: = %d\n", i );

   printf( "Real: = %f\n", fp );

}

Output:

String = 15

Character = 1

Integer: = 15

Real: = 15.000000

 

sscanf的注意事项:

   1、把原字符串转换为另一个字符串时,只会把以原字符串的第一个连续字符串读取出来,空格与回车后的字符会被节掉

   2、转换为数值时,必须以数字开头

Example

/* SPRINTF.C: This program uses sprintf to format various

 * data and place them in the string named buffer.

 */

#include <stdio.h>

void main( void )

{

   char buffer[200], s[] = "computer", c = 'l';

   int i = 35, j;

   float fp = 1.7320534f;

   /* Format and print various data: */

   j = sprintf( buffer, "\tString: %s\n", s );

   j += sprintf( buffer + j, "\tCharacter: %c\n", c );

   j += sprintf( buffer + j, "\tInteger: %d\n", i );

   j += sprintf( buffer + j, "\tReal: %f\n", fp );

   printf( "Output:\n%s\ncharacter count = %d\n", buffer, j );

}

Output:

   String: computer

   Character: l

   Integer: 35

   Real: 1.732053

character count = 71

 

 

二、atoi atof atol (stdlib.h)

double atof( const char *string );

int atoi( const char *string );

__int64 _atoi64( const char *string );

long atol( const char *string );

 

 

三、_itoa _ltoa 整形数据转换

从value转化到string,radix为数值的进制

char *_itoa( int value, char *string, int radix );

char *_ltoa( long value, char *string, int radix );

 

 

四、_ecvt _fcvt _gcvt

// Converts a double number to a string

char *_ecvt( double value, int count, int *dec, int *sign );

// Converts a floating-point number to a string

char *_fcvt( double value, int count, int *dec, int *sign );

// Converts a floating-point value to a string, which it stores in a buffer

char *_gcvt( double value, int digits, char *buffer );

 

    前两个函数功能与用法相似,只是一个转换单精度一个是转换双精度,但第三个函数与它们的区别很大:

  1、_ecvt与_fcvt的第二个参数count,表示有效数字的个数,与_gcvt的第二个参数digits一样。_ecvt与_fcvt的第三个参数dec表示小数点后的位数,第四个参数sign表示数值的正负,0表示正,1表示负。

  2、_ecvt与_fcvt把浮点数转化为字符串后是没有正负符号与小数点的,它们会被存入后边的两个参数:dec、sign。而且它们会自动分配字符串的分配空间,也就是说只要调用了这两个函数,它们就自己分配空间来存储字符串,然后返回字符串的指针。

  3、_gcvt函数也许更为常用。它需要用户自己分配一个缓冲区buffer来存储转换后的变量。这点与sprintf和atof等函数是一致的。还需要注意,它们没必要返回,也就是说没必要把它的返回值赋给其他变量。

  4、_gcvt函数最方便的是它转换后的字符串是保有原数值的符号位与小数点的,也就是说忠实的反映了原数值,能够方便的显示出来。这是与_ecvt、_fcvt的最大区别

 

/* _GCVT.C: This program converts -3.1415e5

 * to its string representation.

 */

#include <stdlib.h>

#include <stdio.h>

void main( void )

{

   char buffer[50];

   double source = -3.1415;

   _gcvt( source, 3, buffer );

   printf( "source: %f buffer: '%s'\n", source, buffer );

}

Output

source: -3.141500 buffer: '-3.14'
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息