首先,应该清楚的是不管是整形、字符还是字符串,在内存的存储都是二进制数值。
一、整型int
1.1 概述
整数类型用来表示不同的取值范围和正负值,含义和数学一样,整数是没有小数部分的值;
区分正负的类型,称为有符类型(signed),无正负的类型(只有正值),称为无符类型。 (unsigned);当声明某变量类型为无符号类型时,需要在类型声明前显示使用unsigned;
1.2 int类型
short int 类型:简写short,C规定占用的空间不能多于int
long int 类型: 简写 long ,占用的空间可能比int多;
long long int 类型: 简写 long long 占用的空间可能比long多;
C标准对基本数据类型只规定了允许的最小大小,这样占用空间的规定是为了适应不同的机器,int 默认被认为是计算机处理整数类型时最高效的类型;考虑某些硬件寄存器16位或者程序开发占用空间资源紧缺情况下,才考虑使用short,只有超出int类型表示的范围才考虑long及long long类型;
//占用空间的大小 2 #include <stdio.h>
int main(void)
{
/* c99 provides a %zd specifier for sizes */ 6 printf("Type short has a size of %zd bytes.\n", sizeof(short));
printf("Type int has a size of %zd bytes.\n", sizeof(int));
printf("Type long has a size of %zd bytes.\n", sizeof(long));
printf("Type long long has a size of %zd bytes.\n",sizeof(long long));
return 0;
}
//Ubuntu16.04 64bit print:14 Type short has a size of 2 bytes.
Type int has a size of 4 bytes.
Type long has a size of 8 bytes.
Type long long has a size of 8 bytes.
1.3 C语言中的转换说明打印不同int类型
以十进制显示输出使用%d,
以八进制显示输出使用%o或%#o(在数字前面显示进制代表符号)
十六进制显示输出使用%x或%X或%#X;
short类型使用前缀h:即%hd表示以十进制显示short类型的整数,%ho以八进制显示short类型的整数,%hx表示以十六进制显示short类型的整数;
#include <stdio.h>
int main(void)
{
short i = 4;
printf("i = %hd \n", i);
printf("i = %#ho \n", i);
printf("i = %#hx \n", i);
return 0;
}
long 类型使用前缀l:即%ld表示以十进制显示short类型的整数,%lo以八进制显示short类型的整数,%lx表示以十六进制显示short类型的整数;
相应的,long long类型使用前缀ll;
注意:
不同的转换说明是指定计算机以什么样的格式进行存储和计算,使用不正确的转换可能产生错误;
#include <stdio.h>
int main(void)
{
short sn = 200;
long ln = 65537;
long long lln = 184467440737095516;
printf(" sn = %hd and %d\n", sn, sn);
printf(" ln = %ld not is %hd\n", ln, ln);
printf("lln = %lld not is %ld \n", lln, lln);
return 0;
}
12 //print as:13 sn = 200 and 20014 ln = 65537 not is 115 lln = 1234567891708641112 not is -171798692
结论:
1.int类型被认为是计算机处理整数类型时最高效的类型,当给函数传递参数时,编译器把short类型自动转换为int类型
2.65537已超出short类型能表示的范围,使用%hd转换说明来显示一个已超出short类型的数据时,计算机则进行显示该较大整数截断成short类型的值后进行输出显示,由此可推出:超出类型所表示的范围时,数据将产生截断;
short类型最大范围:2^16 - 1 = 65535 即这16位上的数字全是1
可以推出65537用二进制表示时第17位和第1位上的数字为1其余为0;
用short类型显示输出long类型数据时,只显示后16位,故输出为1;
二、字符型char
2.1 字符型的本质
计算机使用数字编码来处理字符,即使用特定的整数表示特定的字符,故char本质上为整型;
美国最常用的编码是ASCII编码,标准范围0~127,只需要7位二进制即可表示;但也存在其他字符集超过了127,例如日本汉字kanji字符集,商用统一码Unicode等等;
C语言把1字节定义为char类型占用的位数;即1Byte=8bit,故无论16位还是32位系统都可以使用char类型
2.2 字符常量和初始化
用单引号括起来的单个字符被称为字符常量,当编译器发现’A’便会将其转换为相应的代码值(65);注意:单引号仅适用于字符、数字和标点符号;
2.3 非打印字符
非打印字符通常是一些表示行为的字符,如退格、换行、终端响铃或封鸣,C语言中使用转义序列来表示一些特殊的字符,同样的将转义序列赋值给字符变量时,必须使用单引号将转义序列括起来;
1 转义序列 含义
2 \a 警报
3 \b 退格
4 \f 换页
5 \n 换行
6 \r 回车
7 \t 水平制表位
8 \v 垂直制表位
9 \ 反斜杠()
10 \’ 单引号
11 \” 双引号
12 \? 问号
2.4 打印字符
#include <stdio.h>
int main(void)
{
char ch;
printf("Please enter a character…\n");
scanf("%c",&ch)
printf("The code for %c is %d\n", ch, ch);
return 0;
}
输入某字母后按下回车键,scanf()函数会读取输入的字符,&符号表示将输入的字符赋给变量ch,printf()函数将打印两次ch,一次打印字符类型(转换说明%c),一次打印整型(%d)
2.5 字符型是有符号还是无符号
取决于编译器,**有的编译器将char实现为有符号类型,表示范围是-128~127**,一共128个字符,对应128(0-127)个整型。有些编译器则实现为无符号类型,即表示范围是0~255;但是C语言允许在char前面使用signed,unsigned来显示指定具体;
三、字符串string
字符串的内容是由一个一个的字符编码组成**(数组中存放的是一个一个的字符(0-127整数))**,连续的排列在内存里面,长度信息有两种表示方式**(1)加入长度的数据,(2)加入特定的结尾符号;** <br /> 在 C 语言中,字符串是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。<br /> 由于在数组的末尾存储了空字符,**所以字符数组的大小比存入的字符数多一个,**一个字符串的内存大小=字符的大小+一个字节的结尾符号;
- 字符串中的每个字符,连续存放在一段内存里面,内存里面存放的是字符所对应的二进制编码;
- 结束后以结尾符号\0–>二进制数据0结束
- 字符串的内存除了存放内存数据以外还有一个结尾符号,
- 所以需要多一个字节来存放一个字符串,存完内容以后,多出来的字节存放结尾符号;
- 在做存字符串的时候,要保证分配的内存,能够存下字符串,字符串的字节+1(结尾符号)
四、整型与字符串转换
我们写程序的时候经常会遇到整型和字符串相互转换的问题,这里要用到几个函数,itoa(),atoi(),sprintf()下面来介绍下这几个函数的具体用法!4.1 整型转字符串
方法一:利用标准转换函数:
C语言库函数名: itoa()<br /> **原型:char *itoa(int value, char *string, int radix);**<br /> 功 能:把一整数转换为字符串 <br /> 详细解释:itoa是英文integer to array(将int整型数转化为一个字符串,并将值保存在数组string中)的缩写.<br /> 参数:<br /> value: 待转化的整数。<br /> radix: 是基数的意思,即先将value转化为radix进制的数,范围介于2-36,比如10表示10进制,16表示16进制。<br /> * string: 保存转换后得到的字符串。<br /> 返回值:<br /> char * : 指向生成的字符串, 同*string。<br /> 备注:该函数的头文件是"stdlib.h"<br />//itoa用法
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int main(){
int number = 123456;
char str[20];
itoa(number,str,10);
printf("integer=%d,string=%s\n",number,str);
cout<<"str[0]: "<<str[0]<<endl;
}
方法二:利用sprintf()函数
函数声明
int sprintf(char string, char format [,argument,…]);
参数列表
string— 这是指向一个字符数组的指针,该数组存储了 C 字符串。
format— 这是字符串,包含了要被写入到字符串 str 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是%[flags][width][.precision][length]specifier
[argument]…:根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
功能
把格式化的数据写入某个字符串缓冲区。
返回值
如果成功,则返回写入的字符总数,不包括字符串追加在字符串末尾的空字符。如果失败,则返回一个负数。
sprintf 返回以format为格式argument为内容组成的结果被写入string的字节数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的string后,函数sprintf 返回5
1. 可以将变量打印到字符串里,获取数字的字符形式
//sprintf()用法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
char str[100];//声明一个字符数组,存放字符串
int n = 1234;
sprintf(str,"%d",n);
cout<<str<<endl;
return 0;
}
4.2 字符串转整型
atoi
C语言库函数名: atoi()
原型: int atoi(const char *nptr);
功 能: 把字符串转换成整型数.
名字来源:array to integer 的缩写.
函数说明: atoi()会扫描参数nptr字符串,如果第一个字符不是数字也不是正负号返回零,否则开始做类型转换,之后检测到非数字或结束符 \0 时停止转换,返回整型数。
需要用到的头文件: #include
//atoi用法
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
int main(){
char *str = "123456";
int n = atoi(str);
printf("string=%s, int=%d\n",str,n);
return 0;
}
转换实例
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
#define SEND_SIZE 5120 //每次发送5K的数据
#define DATE_SIZE 3
int main()
{
char send_buf[SEND_SIZE] = { 0 };
int date_value = 0;
char date_char[DATE_SIZE] = { 0 };
memset(send_buf, 0, SEND_SIZE);//输入前清空缓存
for (int i = 0; i < SEND_SIZE - DATE_SIZE + 1; i++)
{
date_value = rand() % 21;
printf("%2d ", date_value);
sprintf(date_char, "%d", date_value);//转换成字符串
if (date_value < 10)//以两位存储,如9存为09
{
send_buf[i] = '0';
send_buf[++i] = date_char[0];
}
else
{
send_buf[i] = date_char[0];
send_buf[++i] = date_char[1];
}
}
printf("\n");
for (int i = 0; i < 5118;i++)//将转换成的字符串的字符打印出来
{
printf("%c", send_buf[i]);
i++;
printf("%c ", send_buf[i]);
}
printf("\n ");
printf("%s\n",send_buf);//打印字符数组
}