C Primer Plus ---- Chapter 3 ----Data and C ----4. 类型转换
程序员文章站
2024-02-29 18:31:58
...
C Primer Plus ---- Chapter 3 ----Data and C ----4. 类型转换
参考:
深入理解计算机系统英文版第二版p103
c程序设计语言英文版第二版p42
1. 字符转换为整型
c 规定可打印字符是非负数,其他的根据编译器的不同可能为signed char 或 unsigned char。
2. 赋值时类型转换
如果在赋值符号左右两边的类型不同,将赋值号右边值的类型转换为左边值的类型。如:
int i;
char c;
i = c; //转换为 int
c = i; //转换为char
3. printf() 内格式说明符转换
printf() 函数内的格式说明符如 %d等可以对数据强制转换。
4. 表达式中类型转换
表达式中运算符的左右两边是不同类型时会进行类型转换,转换规则是:低等级向高等级转换。
低等级指表示范围小的类型,如 singed int 等级比 unsigned int 低。
例子:
-1 < 0U //将 -1 转换为 unsigned int,这样-1的值变了
注意:浮点型转换为整型是直接将小数部分截断。
5. 圆括号强制转换
(type-name) expression
(type-name) variable
表达式或变量会被转化为括号内的类型,如:
unsigned ux;
int tx;
tx = (int) ux; //ux 转换为 int
6. 扩展比特位
参考:
深入理解计算机系统英文版第二版p105
6.1 unsigned 扩展
unsigned 型扩展为更多位数类型:
补零扩展:到高位补0
6.2 signed 扩展
signed 型扩展为更多位数类型:
符号扩展(sign expression),即扩展的高位全部补上符号位
6.3 程序示例
#include<stdio.h>
typedef unsigned char* byte_pointer;
void show_bytes(byte_pointer start, size_t len);
int main(void)
{
short sx = -12345;
unsigned short usx = sx;
int x = sx;
unsigned ux = usx;
printf("sx = %d:\t",sx);
show_bytes((byte_pointer) &sx, sizeof(short));
printf("usx = %u:\t",usx);
show_bytes((byte_pointer) &usx, sizeof(unsigned short));
printf("x = %d:\t",x);
show_bytes((byte_pointer) &x, sizeof(int));
printf("ux = %d:\t",ux);
show_bytes((byte_pointer) &ux, sizeof(unsigned));
return 0;
}
void show_bytes(byte_pointer start, size_t len)
{
size_t i;
for(i = 0; i < len; i++)
printf("%.2x ",start[i]);//%.2x 至少显示2位有效位
putchar('\n');
}
结果:
sx = -12345: c7 cf
usx = 53191: c7 cf
x = -12345: c7 cf ff ff
ux = 53191: c7 cf 00 00
分析:
- 同一类型的符号数和无符号数的位数相同,其各位的值不变,只是计算方法不同,符号数用补码计算,范围和无符号数不同。
- short 转换为 int,需扩展高位,符号数高位补符号位,负数补1。
- unsigned short 转化为 unsigned int 需扩展高位,高位补0。
- 从上可以看出,高位扩展符号位后,补码的结果相同,推理证明见补码的计算公式(深入理解计算机系统英文版第二版p107)。
- show_bytes 以十六进制显示数值的字节表示,并通过结果看出本系统采用小端模式(little endian),即低位存储数值低位。(深入理解计算机系统英文版第二版p74)
该函数具体介绍参见:深入理解计算机系统基础 show_bytes函数
7. 截断比特位
如果高级的数据类型转换为低级的,如 int 转化为 short,则将丢弃多余的高位,具体见:
深入理解计算机系统英文版第二版p109
上一篇: 关于filter滤镜应用于图片的两种创意
下一篇: Android8.0之后启动服务崩溃