1. 首先,应该清楚的是不管是整形、字符还是字符串,在内存的存储都是二进制数值。

一、整型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类型;

  1. //占用空间的大小 2 #include <stdio.h>
  2. int main(void)
  3. {
  4. /* c99 provides a %zd specifier for sizes */ 6 printf("Type short has a size of %zd bytes.\n", sizeof(short));
  5. printf("Type int has a size of %zd bytes.\n", sizeof(int));
  6. printf("Type long has a size of %zd bytes.\n", sizeof(long));
  7. printf("Type long long has a size of %zd bytes.\n",sizeof(long long));
  8. return 0;
  9. }
  10. //Ubuntu16.04 64bit print:14 Type short has a size of 2 bytes.
  11. Type int has a size of 4 bytes.
  12. Type long has a size of 8 bytes.
  13. 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类型的整数;

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. short i = 4;
  5. printf("i = %hd \n", i);
  6. printf("i = %#ho \n", i);
  7. printf("i = %#hx \n", i);
  8. return 0;
  9. }

long 类型使用前缀l:即%ld表示以十进制显示short类型的整数,%lo以八进制显示short类型的整数,%lx表示以十六进制显示short类型的整数;
相应的,long long类型使用前缀ll;
注意:
不同的转换说明是指定计算机以什么样的格式进行存储和计算,使用不正确的转换可能产生错误;

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. short sn = 200;
  5. long ln = 65537;
  6. long long lln = 184467440737095516;
  7. printf(" sn = %hd and %d\n", sn, sn);
  8. printf(" ln = %ld not is %hd\n", ln, ln);
  9. printf("lln = %lld not is %ld \n", lln, lln);
  10. return 0;
  11. }
  12. 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类型
整型、字符、字符串 - 图1

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 打印字符

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. char ch;
  5. printf("Please enter a character…\n");
  6. scanf("%c",&ch)
  7. printf("The code for %c is %d\n", ch, ch);
  8. return 0;
  9. }

输入某字母后按下回车键,scanf()函数会读取输入的字符,&符号表示将输入的字符赋给变量ch,printf()函数将打印两次ch,一次打印字符类型(转换说明%c),一次打印整型(%d)

2.5 字符型是有符号还是无符号

  1. 取决于编译器,**有的编译器将char实现为有符号类型,表示范围是-128~127**,一共128个字符,对应1280-127)个整型。有些编译器则实现为无符号类型,即表示范围是0~255;但是C语言允许在char前面使用signedunsigned来显示指定具体;

三、字符串string

  1. 字符串的内容是由一个一个的字符编码组成**(数组中存放的是一个一个的字符(0-127整数))**,连续的排列在内存里面,长度信息有两种表示方式**(1)加入长度的数据,(2)加入特定的结尾符号;** <br /> C 语言中,字符串是使用 null 字符 '\0' 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。<br /> 由于在数组的末尾存储了空字符,**所以字符数组的大小比存入的字符数多一个,**一个字符串的内存大小=字符的大小+一个字节的结尾符号;
  • 字符串中的每个字符,连续存放在一段内存里面,内存里面存放的是字符所对应的二进制编码;
  • 结束后以结尾符号\0–>二进制数据0结束
  • 字符串的内存除了存放内存数据以外还有一个结尾符号,
  • 所以需要多一个字节来存放一个字符串,存完内容以后,多出来的字节存放结尾符号;
  • 在做存字符串的时候,要保证分配的内存,能够存下字符串,字符串的字节+1(结尾符号)

    四、整型与字符串转换

      我们写程序的时候经常会遇到整型和字符串相互转换的问题,这里要用到几个函数,itoa(),atoi(),sprintf()下面来介绍下这几个函数的具体用法!

    4.1 整型转字符串

    方法一:利用标准转换函数:

    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用法
    1. #include<iostream>
    2. #include<cstdlib>
    3. #include<cstdio>
    4. using namespace std;
    5. int main(){
    6. int number = 123456;
    7. char str[20];
    8. itoa(number,str,10);
    9. printf("integer=%d,string=%s\n",number,str);
    10. cout<<"str[0]: "<<str[0]<<endl;
    11. }

方法二:利用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()用法

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. int main(){
  6. char str[100];//声明一个字符数组,存放字符串
  7. int n = 1234;
  8. sprintf(str,"%d",n);
  9. cout<<str<<endl;
  10. return 0;
  11. }

4.2 字符串转整型

atoi
  C语言库函数名: atoi()
原型: int atoi(const char *nptr);
  功 能: 把字符串转换成整型数.
  名字来源:array to integer 的缩写.
  函数说明: atoi()会扫描参数nptr字符串,如果第一个字符不是数字也不是正负号返回零,否则开始做类型转换,之后检测到非数字或结束符 \0 时停止转换,返回整型数。
  需要用到的头文件: #include
//atoi用法

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. using namespace std;
  6. int main(){
  7. char *str = "123456";
  8. int n = atoi(str);
  9. printf("string=%s, int=%d\n",str,n);
  10. return 0;
  11. }

转换实例

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<windows.h>
  4. #define SEND_SIZE 5120 //每次发送5K的数据
  5. #define DATE_SIZE 3
  6. int main()
  7. {
  8. char send_buf[SEND_SIZE] = { 0 };
  9. int date_value = 0;
  10. char date_char[DATE_SIZE] = { 0 };
  11. memset(send_buf, 0, SEND_SIZE);//输入前清空缓存
  12. for (int i = 0; i < SEND_SIZE - DATE_SIZE + 1; i++)
  13. {
  14. date_value = rand() % 21;
  15. printf("%2d ", date_value);
  16. sprintf(date_char, "%d", date_value);//转换成字符串
  17. if (date_value < 10)//以两位存储,如9存为09
  18. {
  19. send_buf[i] = '0';
  20. send_buf[++i] = date_char[0];
  21. }
  22. else
  23. {
  24. send_buf[i] = date_char[0];
  25. send_buf[++i] = date_char[1];
  26. }
  27. }
  28. printf("\n");
  29. for (int i = 0; i < 5118;i++)//将转换成的字符串的字符打印出来
  30. {
  31. printf("%c", send_buf[i]);
  32. i++;
  33. printf("%c ", send_buf[i]);
  34. }
  35. printf("\n ");
  36. printf("%s\n",send_buf);//打印字符数组
  37. }