上一篇<一起学习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 格式化整数规定符和取值范围(对应位数)
我们再一次见到了这张表格,这次我们结合上述的整数类型完成更多的打印方式。
需要说明的是,在部分编译器中使用格式化整数规定符计算超过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码表
1.3-1 Ascll码对应表
字符范围0-127与国际Ascll码表中的信息一一对应,比如数字10在国际Ascll码对应表中表示数据换行,在VS中输出:
char a = 10;
printf(“test %s.”, &a);
得到输出结果:test烫烫烫烫
.
从输出结果中可以看出,.换到了下一行(烫烫烫烫属于打印信息未做输出结尾处理的原因,后续字符串相关讲解)。
字符数字范围128-255属于扩充字符,并非标准的ASCII码值,在不同的字符集中,扩充字符表示的意义也不相同。VS编译器默认采用GB2312编码,中文“烫”由两扩展个字节0xCC(204)、 0xCC组成。
目录预览
<一起学习C语言:C语言发展历程以及定制学习计划>
<一起学习C语言:初步进入编程世界(一)>
<一起学习C语言:初步进入编程世界(二)>
<一起学习C语言:初步进入编程世界(三)>
<一起学习C语言:C语言数据类型(一)>