上一篇<一起学习C语言:C语言数据类型(一)>中,我们了解到“位与字节”的含义,并分析无符号短整形和有符号短整形的运算方式。本篇文章中,我们进行分析二进制到八进制、十六进制转换等内容。


章节预览:


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至214748364732
%u十进制无符号整数0至429496729532
%o八进制无符号整数0至3777777777732
%x十六进制无符号整数(小写)0至ffffffff32
%X十六进制无符号整数(大写)0至FFFFFFFF32
%I64d64位有符号整数(MFC(windows平台))-9223372036854775808至922337203685477580764
%lld64位有符号整数(linux平台)-9223372036854775808至922337203685477580764
%I64u64位无符号整数(MFC(windows平台))0至1844674407370955161564
%llu64位无符号整数(linux平台)0至1844674407370955161564

  我们再一次见到了这张表格,这次我们结合上述的整数类型完成更多的打印方式。
  需要说明的是,在部分编译器中使用格式化整数规定符计算超过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码表

十进制数二进制数缩写/符号程序显示名称描述
00000 0000NUL0空字符
10000 0001SOH‘□’标题开始
20000 0010STX‘’正文开始
30000 0011ETX‘□’正文结束
40000 0100EOT‘□’传输结束
50000 0101ENQ‘□’请求
60000 0110ACK‘□’请求回应/确认回应
70000 0111BEL‘□’响铃
80000 1000BS‘□’退格
90000 1001HT’ ’水平定位符
100000 1010LF’ ’换行键
110000 1011VT‘□’垂直定位符
120000 1100FF‘♠’换页键
130000 1101CR’ ’归位键
140000 1110SO‘□’取消变换
150000 1111SI‘□’启用变换
160001 0000DLE‘□’跳出数据通讯
170001 0001DC1‘□’设备控制一
180001 0010DC2‘□’设备控制二
190001 0011DC3‘□’设备控制三
200001 0100DC4‘□’设备控制四
210001 0101NAK‘□’确认失败回应
220001 0110SYN‘□’同步用暂停
230001 0111ETB‘□’区块传输结束
240001 1000CAN‘□’取消
250001 1001EM‘□’连接介质中断
260001 0101SUB‘□’替换
270001 1011ESC‘□’跳出/退出
280001 1100FS‘’文件分割符
290001 1101GS‘’组群分隔符
300001 1110RS’ ’记录分隔符
310001 1111US‘¬’单元分隔符
320010 0000(space)’ ’空格符
330010 0001!‘!’感叹号
340010 0010"‘"’双引号
350010 0011#‘#’数字符号
360010 0100$‘$’美元符号
370010 0101%‘%’百分号
380010 0110&‘&’与符号
390010 0111‘’’单引号
400010 1000(‘(’左小括号
410010 1001)‘)’右小括号
420010 1010*‘*’星号
430010 1011+‘+’加号
440010 1100,‘,’逗号
450010 1101‘-’减号
460010 1110.‘.’英文句号或小数点
470010 1111/‘/’斜杠
480011 00000‘0’数字0
490011 00011‘1’数字1
500011 00102‘2’数字2
510011 00113‘3’数字3
520011 01004‘4’数字4
530011 01015‘5’数字5
540011 01106‘6’数字6
550011 01117‘7’数字7
560011 10008‘8’数字8
570011 10019‘9’数字9
580011 1010:‘:’冒号
590011 1011;‘;’分号
600011 1100<‘<’小于号
610011 1101=‘=’等于号
620011 1110>‘>’大于号
630011 1111?‘?’问号
640100 0000@‘@’at符号
650100 0001A‘A’大写字符A
660100 0010B‘B’大写字符B
670100 0011C‘C’大写字符C
680100 0100D‘D’大写字符D
690100 0101E‘E’大写字符E
700100 0110F‘F’大写字符F
710100 0111G‘G’大写字符G
720100 1000H‘H’大写字符H
730100 1001I‘I’大写字符I
740100 1010J‘J’大写字符J
750100 1011K‘K’大写字符K
760100 1100L‘L’大写字符L
770100 1101M‘M’大写字符M
780100 1110N‘N’大写字符N
790100 1111O‘O’大写字符O
800101 0000P‘P’大写字符P
810101 0001Q‘Q’大写字符Q
820101 0010R‘R’大写字符R
830101 0011S‘S’大写字符S
840101 0100T‘T’大写字符T
850101 0101U‘U’大写字符U
860101 0110V‘V’大写字符V
870101 0111W‘W’大写字符W
880101 1000X‘X’大写字符X
890101 1001Y‘Y’大写字符Y
900101 1010Z‘Z’大写字符Z
910101 1011[‘[’左中括号
920101 1100\‘’反斜杠
930101 1101]‘]’右中括号
940101 1110^‘^’音调符号(次方描述符)
950101 1111_‘_’下划线
960110 0000`‘`’重音符
970110 0001a‘a’小写字符a
980110 0010b‘b’小写字符b
990110 0011c‘c’小写字符c
1000110 0100d‘d’小写字符d
1010110 0101e‘e’小写字符e
1020110 0110f‘f’小写字符f
1030110 0111g‘g’小写字符g
1040110 1000h‘h’小写字符h
1050110 1001i‘i’小写字符i
1060110 1010j‘j’小写字符j
1070110 1011k‘k’小写字符k
1080110 1100l‘l’小写字符l
1090110 1101m‘m’小写字符m
1100110 1110n‘n’小写字符n
1110110 1111o‘o’小写字符o
1120111 0000p‘p’小写字符p
1130111 0001q‘q’小写字符q
1140111 0010r‘r’小写字符r
1150111 0011s‘s’小写字符s
1160111 0100t‘t’小写字符t
1170111 0101u‘u’小写字符u
1180111 0110v‘v’小写字符v
1190111 0111w‘w’小写字符w
1200111 1000x‘x’小写字符x
1210111 1001y‘y’小写字符y
1220111 1010z‘z’小写字符z
1230111 1011{‘{’左大括号
1240111 1100|‘|’或符号
1250111 1101}‘}’右大括号
1260111 1110~‘~’代字号(波浪号)
1270111 1111DEL‘□’删除(DELETE)
1281000 0000‘€’欧元符号
1291000 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组成。


目录预览


<一起学习C语言:C语言发展历程以及定制学习计划>
<一起学习C语言:初步进入编程世界(一)>
<一起学习C语言:初步进入编程世界(二)>
<一起学习C语言:初步进入编程世界(三)>
<一起学习C语言:C语言数据类型(一)>

更多推荐

一起学习C语言:C语言数据类型(二)