欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C Primer Plus ---- Chapter 3 ----Data and C ----4. 类型转换

程序员文章站 2024-02-29 18:31:58
...

参考:

深入理解计算机系统英文版第二版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 

分析:

  1. 同一类型的符号数和无符号数的位数相同,其各位的值不变,只是计算方法不同,符号数用补码计算,范围和无符号数不同。
  2. short 转换为 int,需扩展高位,符号数高位补符号位,负数补1。
  3. unsigned short 转化为 unsigned int 需扩展高位,高位补0。
  4. 从上可以看出,高位扩展符号位后,补码的结果相同,推理证明见补码的计算公式(深入理解计算机系统英文版第二版p107)。
  5. show_bytes 以十六进制显示数值的字节表示,并通过结果看出本系统采用小端模式(little endian),即低位存储数值低位。(深入理解计算机系统英文版第二版p74)

该函数具体介绍参见:深入理解计算机系统基础 show_bytes函数

7. 截断比特位

如果高级的数据类型转换为低级的,如 int 转化为 short,则将丢弃多余的高位,具体见:

深入理解计算机系统英文版第二版p109