C++类型转换

强制类型转换、使用函数转换与memcpy

如果一个int型的变量值为5,则若使用强制类型转换或者使用memcpy,则相当于直接copy内存中的值,若打印,则会打印5对应的ASCII值;而若使用函数转换,则函数会操作内存转为ASCII值的5,若打印,则直接为5

memcpy在一定程度上相当于强制类型转换,但是可以制定拷贝的字节大小,因此可能不会出现丢失数据,如大于256的时候,int强制转char,复制低8位给char,其余舍弃

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


// 不足4个字节的前面补零
void int2char(int number, char* result, int length_send)
{
char str[20];
sprintf(str,"%4d",number); // 格式化输出int到str字符串

int i;
for(i=0;i<length_send;++i)
if(str[i]==' ')
str[i]=' ';
strcpy(result,str); // result 此时只有2个char的大小,但是仍然可以copy4个字节给他
}


// memcpy在一定程度上相当于强制类型转换,但是可以制定拷贝的字节大小,因此可能不会出现丢失数据,如大于256的时候,int强制转char。
int main(int argc, char const *argv[])
{
int num = 97;
printf("num:%d\n", num);
printf("\n");


/**********************************
强制类型转换与读取
**********************************/
char c = (char)num;
printf("c:%c\n", c);
printf("read_c:%d\n", (int)c);
printf("\n");


/**********************************
函数类型转换与读取
**********************************/
//char *d; //报错,需要声明大小
char *d = (char*)malloc(sizeof(char)*2);
//char d[24]; // 也行

int2char(num, d, 4); // 使用函数转换,不足4位的前面补零,事实证明此函数废的
printf("d_string:%s\t%d\n", d, (int)strlen(d));
int read_d = atoi(d); // 这个d前面补零与补零都可以
printf("read_d:%d\n", read_d);
printf("\n");

char *dd = (char*)malloc(sizeof(char)*2);
sprintf(dd, "%4d", num); //也行
printf("compare dd and d:if equal,then 0:%d\n", strcmp(dd,d));
int read_dd = atoi(dd); // 这个d前面补零与补零都可以解析
printf("read_dd:d%d\n", read_dd);
printf("\n");


/**********************************
memcpy类型转换与读取
**********************************/
char *e = (char*)malloc(sizeof(char)*4);
//char e[4];
memcpy(e,&num,sizeof(num)); //相当于强制类型转换
printf("e:%s\n", e);
int f;
memcpy(&f,e,sizeof(e)); //强制类型转换过来
printf("read_e:%d\n", f);

return 0;
}

运行结果为

字节数组byte[]与int类型转换

1
2
3
4
5
6
//int --> BYTE[]:
int data = 0xFFFFFFFF;
unsigned char buf[4];
memcpy(buf, &data, sizeof(int));
//BYTE[] --> int :
memcpy(&data, buf, 4);

Char数组转为int类型

对于socket编程,服务端发送的时候,发送的长和宽均为4个字节的char型数组,而总长度为8个字节的char数组,接收和转int类型的代码如下,因为char数组,以\0结尾,所以这里声明大小的时候,需要大于1位。

而将char数组转换int类型,则使用atoi,注意c_str()作用是将string转为char,因此不用加。

例如

1
2
3
4
5
6
7
8
9
10
11
12
char len[9] = {0};
char wid[5] = {0};
char hei[5] = {0};

recv(fd, len, 8, 0);
recv(fd, wid, 4, 0);
recv(fd, hei, 4, 0);
printf("length:%s\nclos:%s\nrows:%s\n", len, wid, hei);

length = atoi(len);
width = atoi(wid);
height = atoi(hei);

string 与 int 互转

string转int的方式

1) 采用最原始的string, 然后按照十进制的特点进行算术运算得到int,但是这种方式太麻烦,这里不介绍了。

2) 采用标准库中atoi函数。对于其他类型也都有相应的标准库函数,比如浮点型atof(),long型atol()等等。

1
2
string s = "12"; 
int a = atoi(s.c_str());

3) 采用sstream头文件中定义的字符串流对象来实现转换。

1
2
3
istringstream is("12"); //构造输入字符串流,流的内容初始化为“12”的字符串 
int i;
is >> i; //从is流中读入一个int整数存入i中`

int转string的方式

1) 采用标准库中的to_string函数。

1
2
int i = 12; 
cout << std::to_string(i) << endl;`

不需要包含任何头文件,应该是在utility中,但无需包含,直接使用,还定义任何其他内置类型转为string的重载函数,很方便。

2) 采用sstream中定义的字符串流对象来实现。

1
2
3
4
ostringstream os; //构造一个输出字符串流,流内容为空 
int i = 12;
os << i; //向输出字符串流中输出int整数i的内容
cout << os.str() << endl; //利用字符串流的str函数获取流中的内容

字符串流对象的str函数对于istringstream和ostringstream都适用,都可以获取流中的内容。

string转char

1
2
string s = "12";
s.c_str()

const char*char* 之间的转换

const char*是指向常量的指针,而不是指针本身为常量,可以不被初始化.该指针可以指向常量也可以指向变量,只是从该指针的角度而言,它所指向的是常量,通过该指针不能修改它所指向的数据.

const char*转为char*

const char*是不能直接赋值到char*的,这样编译都不能通过,理由:假如可以的话,那么通过char*就可以修改const char指向的内容了,这是不允许的.所以char*要另外开辟新的空间。

1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
void main(){
const char* cpc="abcde";
char* pc=new char[100];
strcpy(pc,cpc);
cout<<pc<<endl;
}

char*转为const char*

直接赋值就可以了

1
2
3
const char* cpc;
char* pc="abcde";
cpc=pc;

参考

const char 和char 之间的转换

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道