章节预览:
1.2.2 无符号类型与有符号类型的区别1.2.3 短整型、整形以及长整形的区别
1.2.4 整形
1.2.5 长整形
1.2.6 判断类型字节长度
1.2.7 八进制、十进制和十六进制
1.2.8 格式化整数规定符和取值范围(对应位数)
1.3 字符类型
1.3.1 无符号字符类型
1.3.2 有符号字符类型
1.3.3 字符类型与Ascll码表
目录预览
章节内容:
1.2.2 无符号类型与有符号类型的区别
通常情况下,无符号类型拥有的所有bit(位)都属于数字位;有符号类型中,最高bit(位)为符号位,其余bit(位)为数字位。当然,还存在一种特殊情况,有符号类型计算负数最小值时,需要考虑最高进位。
1.2.3 短整型、整形以及长整形的区别
在C语言中,短整型、整形和长整形采用相同的二进制转换方式,唯一不同之处是他们的位数(取值范围)。
1.2.4 整形
unsigned int表示“无符号整型”,在16位系统下int占用两个字节,32位以及64位系统下int占用四个字节。
signed int表示“有符号整型”,程序中简写为int,在16位系统下int占用两个字节,32位以及64位系统下int占用四个字节。
特别说明:
当编译器数据模型为LP32(32位),unsigned int 和 int占用两个字节。
1.2.5 长整形
unsigned long int表示“无符号长整型”,程序中简写为unsigned long,在16位、32位系统下unsigned long占用四个字节,64位系统下unsigned long占用八个字节。
signed long int表示“有符号长整型”,程序中简写为long,在16位、32位系统下long占用四个字节,以及64位系统下long占用八个字节。
特别说明:
当编译器数据模型为LLP64 (64位)时,unsigned long 和 long 占用四个字节。
在C99标准中,扩展了新的整数类型 unsigned long long 和 long long类型,它们属于长整形的扩充版本。目前大部分编译器中,unsigned long long 和 long long类型分别占用八个字节。
1.2.6 判断类型字节长度
在不同的编译器位数以及不同的编译器数据模型下,所得到的类型字节长度也不相同。在C语言中,我们可以通过sizeof函数获取类型或类型对象的长度。
sizeof函数用法:
unsigned short a = 0;
int aa = sizeof(a); 或 int aa = sizeof a;
通过计算类型对象获取类型长度。
int aa = sizeof(unsigned short);
通过计算类型获取类型长度。
1.2.7 八进制、十进制和十六进制
现在我们了解了不同整数类型的位数以及有符号和无符号的二进制到转换十进制数字,实际编程中十进制也是比较简便和常用的数据存储、查看方式。
在实际编程过程中,八进制和十六进制数字在部分领域也作为主要的数据存储、查看方式,比如DSP、DMA数据采集存储、计算内存地址等。
二进制数字转换到八进制数字:
二进制数字1100 1001:
1.2-3 二进制转换到八进制数字
二进制数字转换到八进制数字时,每三位二进制数字转换为一位八进制数字,不满足三位时,高位补0对齐,参考图1.2-3 二进制转换到八进制数字,计算方式为:
(2^0 + 0 + 0) * 10^0 + (2^0 + 0 + 0) * 10^1 + (2^0 + 2^1 + 0) * 10^2 = 311
bit0-bit2 bit3-bit5 bit6-bit9
1 10 300
这里只是展示数字计算,实际转换过程不这么做。
二进制数字转换到十六进制数字:
二进制数字100 1111:
1.2-4 二进制转换到十六进制数字
二进制数字转换到十六进制数字时,每四位二进制数字转换为一位十六进制数字,不满足四位时,高位补0对齐,参考图1.2-4 二进制转换到十六进制数字,计算方式为:
(2^0 + 2^1 + 2^2 + 2^3) * 0x10^0 + (0+ 0 + 2^2 + 0) * 0x10^1 = 4f或4F
bit0-bit3 bit4-bit7
f 4
使用十六进制数时,需要在数字前加上0x或0X。这里只是展示数字计算,实际转换过程不这么做。
1.2.8 格式化整数规定符和取值范围(对应位数)
格式化整数规定符 | 描述信息 | 参数范围 | bit |
%d或%i | 十进制有符号整数 | -214748364至2147483647 | 32 |
%u | 十进制无符号整数 | 0至4294967295 | 32 |
%o | 八进制无符号整数 | 0至37777777777 | 32 |
%x | 十六进制无符号整数(小写) | 0至ffffffff | 32 |
%X | 十六进制无符号整数(大写) | 0至FFFFFFFF | 32 |
%I64d | 64位有符号整数(MFC(windows平台)) | -9223372036854775808至9223372036854775807 | 64 |
%lld | 64位有符号整数(linux平台) | -9223372036854775808至9223372036854775807 | 64 |
%I64u | 64位无符号整数(MFC(windows平台)) | 0至18446744073709551615 | 64 |
%llu | 64位无符号整数(linux平台) | 0至18446744073709551615 | 64 |
我们再一次见到了这张表格,这次我们结合上述的整数类型完成更多的打印方式。
需要说明的是,在部分编译器中使用格式化整数规定符计算超过32位的数字时,存在错误结果的现象。
1.3 字符类型
1.3.1 无符号字符类型
unsigned char表示“无符号字符类型”,在16位、32位以及64位系统下都只占用一个字节(Byte)。unsigned char效果等同于与Byte,取值范围(与Byte相同)为0—2^8-1即 0—255。unsigned char也可以理解为C语言中Byte的实现体。
1.3.2 有符号字符类型
signed char表示“有符号字符类型”,程序中简写为char,在16位、32位以及64位系统下也是占用一个字节(Byte)。char取值范围为-27—27-1即 -128—127。对于有符号类型而言,最高位(bit)作为标记符号使用,关于有符号类型的计算方式参考“1.2.1 短整型”。
1.3.3 字符类型与Ascll码表
十进制数 | 二进制数 | 缩写/符号 | 程序显示 | 名称描述 |
0 | 0000 0000 | NUL | 0 | 空字符 |
1 | 0000 0001 | SOH | ‘□’ | 标题开始 |
2 | 0000 0010 | STX | ‘’ | 正文开始 |
3 | 0000 0011 | ETX | ‘□’ | 正文结束 |
4 | 0000 0100 | EOT | ‘□’ | 传输结束 |
5 | 0000 0101 | ENQ | ‘□’ | 请求 |
6 | 0000 0110 | ACK | ‘□’ | 请求回应/确认回应 |
7 | 0000 0111 | BEL | ‘□’ | 响铃 |
8 | 0000 1000 | BS | ‘□’ | 退格 |
9 | 0000 1001 | HT | ’ ’ | 水平定位符 |
10 | 0000 1010 | LF | ’ ’ | 换行键 |
11 | 0000 1011 | VT | ‘□’ | 垂直定位符 |
12 | 0000 1100 | FF | ‘♠’ | 换页键 |
13 | 0000 1101 | CR | ’ ’ | 归位键 |
14 | 0000 1110 | SO | ‘□’ | 取消变换 |
15 | 0000 1111 | SI | ‘□’ | 启用变换 |
16 | 0001 0000 | DLE | ‘□’ | 跳出数据通讯 |
17 | 0001 0001 | DC1 | ‘□’ | 设备控制一 |
18 | 0001 0010 | DC2 | ‘□’ | 设备控制二 |
19 | 0001 0011 | DC3 | ‘□’ | 设备控制三 |
20 | 0001 0100 | DC4 | ‘□’ | 设备控制四 |
21 | 0001 0101 | NAK | ‘□’ | 确认失败回应 |
22 | 0001 0110 | SYN | ‘□’ | 同步用暂停 |
23 | 0001 0111 | ETB | ‘□’ | 区块传输结束 |
24 | 0001 1000 | CAN | ‘□’ | 取消 |
25 | 0001 1001 | EM | ‘□’ | 连接介质中断 |
26 | 0001 0101 | SUB | ‘□’ | 替换 |
27 | 0001 1011 | ESC | ‘□’ | 跳出/退出 |
28 | 0001 1100 | FS | ‘’ | 文件分割符 |
29 | 0001 1101 | GS | ‘’ | 组群分隔符 |
30 | 0001 1110 | RS | ’ ’ | 记录分隔符 |
31 | 0001 1111 | US | ‘¬’ | 单元分隔符 |
32 | 0010 0000 | (space) | ’ ’ | 空格符 |
33 | 0010 0001 | ! | ‘!’ | 感叹号 |
34 | 0010 0010 | " | ‘"’ | 双引号 |
35 | 0010 0011 | # | ‘#’ | 数字符号 |
36 | 0010 0100 | $ | ‘$’ | 美元符号 |
37 | 0010 0101 | % | ‘%’ | 百分号 |
38 | 0010 0110 | & | ‘&’ | 与符号 |
39 | 0010 0111 | “ | ‘’’ | 单引号 |
40 | 0010 1000 | ( | ‘(’ | 左小括号 |
41 | 0010 1001 | ) | ‘)’ | 右小括号 |
42 | 0010 1010 | * | ‘*’ | 星号 |
43 | 0010 1011 | + | ‘+’ | 加号 |
44 | 0010 1100 | , | ‘,’ | 逗号 |
45 | 0010 1101 | – | ‘-’ | 减号 |
46 | 0010 1110 | . | ‘.’ | 英文句号或小数点 |
47 | 0010 1111 | / | ‘/’ | 斜杠 |
48 | 0011 0000 | 0 | ‘0’ | 数字0 |
49 | 0011 0001 | 1 | ‘1’ | 数字1 |
50 | 0011 0010 | 2 | ‘2’ | 数字2 |
51 | 0011 0011 | 3 | ‘3’ | 数字3 |
52 | 0011 0100 | 4 | ‘4’ | 数字4 |
53 | 0011 0101 | 5 | ‘5’ | 数字5 |
54 | 0011 0110 | 6 | ‘6’ | 数字6 |
55 | 0011 0111 | 7 | ‘7’ | 数字7 |
56 | 0011 1000 | 8 | ‘8’ | 数字8 |
57 | 0011 1001 | 9 | ‘9’ | 数字9 |
58 | 0011 1010 | : | ‘:’ | 冒号 |
59 | 0011 1011 | ; | ‘;’ | 分号 |
60 | 0011 1100 | < | ‘<’ | 小于号 |
61 | 0011 1101 | = | ‘=’ | 等于号 |
62 | 0011 1110 | > | ‘>’ | 大于号 |
63 | 0011 1111 | ? | ‘?’ | 问号 |
64 | 0100 0000 | @ | ‘@’ | at符号 |
65 | 0100 0001 | A | ‘A’ | 大写字符A |
66 | 0100 0010 | B | ‘B’ | 大写字符B |
67 | 0100 0011 | C | ‘C’ | 大写字符C |
68 | 0100 0100 | D | ‘D’ | 大写字符D |
69 | 0100 0101 | E | ‘E’ | 大写字符E |
70 | 0100 0110 | F | ‘F’ | 大写字符F |
71 | 0100 0111 | G | ‘G’ | 大写字符G |
72 | 0100 1000 | H | ‘H’ | 大写字符H |
73 | 0100 1001 | I | ‘I’ | 大写字符I |
74 | 0100 1010 | J | ‘J’ | 大写字符J |
75 | 0100 1011 | K | ‘K’ | 大写字符K |
76 | 0100 1100 | L | ‘L’ | 大写字符L |
77 | 0100 1101 | M | ‘M’ | 大写字符M |
78 | 0100 1110 | N | ‘N’ | 大写字符N |
79 | 0100 1111 | O | ‘O’ | 大写字符O |
80 | 0101 0000 | P | ‘P’ | 大写字符P |
81 | 0101 0001 | Q | ‘Q’ | 大写字符Q |
82 | 0101 0010 | R | ‘R’ | 大写字符R |
83 | 0101 0011 | S | ‘S’ | 大写字符S |
84 | 0101 0100 | T | ‘T’ | 大写字符T |
85 | 0101 0101 | U | ‘U’ | 大写字符U |
86 | 0101 0110 | V | ‘V’ | 大写字符V |
87 | 0101 0111 | W | ‘W’ | 大写字符W |
88 | 0101 1000 | X | ‘X’ | 大写字符X |
89 | 0101 1001 | Y | ‘Y’ | 大写字符Y |
90 | 0101 1010 | Z | ‘Z’ | 大写字符Z |
91 | 0101 1011 | [ | ‘[’ | 左中括号 |
92 | 0101 1100 | \ | ‘’ | 反斜杠 |
93 | 0101 1101 | ] | ‘]’ | 右中括号 |
94 | 0101 1110 | ^ | ‘^’ | 音调符号(次方描述符) |
95 | 0101 1111 | _ | ‘_’ | 下划线 |
96 | 0110 0000 | ` | ‘`’ | 重音符 |
97 | 0110 0001 | a | ‘a’ | 小写字符a |
98 | 0110 0010 | b | ‘b’ | 小写字符b |
99 | 0110 0011 | c | ‘c’ | 小写字符c |
100 | 0110 0100 | d | ‘d’ | 小写字符d |
101 | 0110 0101 | e | ‘e’ | 小写字符e |
102 | 0110 0110 | f | ‘f’ | 小写字符f |
103 | 0110 0111 | g | ‘g’ | 小写字符g |
104 | 0110 1000 | h | ‘h’ | 小写字符h |
105 | 0110 1001 | i | ‘i’ | 小写字符i |
106 | 0110 1010 | j | ‘j’ | 小写字符j |
107 | 0110 1011 | k | ‘k’ | 小写字符k |
108 | 0110 1100 | l | ‘l’ | 小写字符l |
109 | 0110 1101 | m | ‘m’ | 小写字符m |
110 | 0110 1110 | n | ‘n’ | 小写字符n |
111 | 0110 1111 | o | ‘o’ | 小写字符o |
112 | 0111 0000 | p | ‘p’ | 小写字符p |
113 | 0111 0001 | q | ‘q’ | 小写字符q |
114 | 0111 0010 | r | ‘r’ | 小写字符r |
115 | 0111 0011 | s | ‘s’ | 小写字符s |
116 | 0111 0100 | t | ‘t’ | 小写字符t |
117 | 0111 0101 | u | ‘u’ | 小写字符u |
118 | 0111 0110 | v | ‘v’ | 小写字符v |
119 | 0111 0111 | w | ‘w’ | 小写字符w |
120 | 0111 1000 | x | ‘x’ | 小写字符x |
121 | 0111 1001 | y | ‘y’ | 小写字符y |
122 | 0111 1010 | z | ‘z’ | 小写字符z |
123 | 0111 1011 | { | ‘{’ | 左大括号 |
124 | 0111 1100 | | | ‘|’ | 或符号 |
125 | 0111 1101 | } | ‘}’ | 右大括号 |
126 | 0111 1110 | ~ | ‘~’ | 代字号(波浪号) |
127 | 0111 1111 | DEL | ‘□’ | 删除(DELETE) |
128 | 1000 0000 | € | ‘€’ | 欧元符号 |
129 | 1000 0001 | ‘?’ | 保留 |
1.3-1 Ascll码对应表
字符范围0-127与国际Ascll码表中的信息一一对应,比如数字10在国际Ascll码对应表中表示数据换行,在VS2010中输出:
char a = 10;
printf(“test %s.”, &a);
得到输出结果:test烫烫烫烫
.
从输出结果中可以看出,.换到了下一行(烫烫烫烫属于打印信息未做输出结尾处理的原因,后续字符串相关讲解)。
字符数字范围128-255属于扩充字符,并非标准的ASCII码值,在不同的字符集中,扩充字符表示的意义也不相同。VS2010编译器默认采用GB2312编码,中文“烫”由两扩展个字节0xCC(204)、 0xCC组成。