计算机酷学(五)

数字(三)

有符号数与无符号数之间的转换

      对于大多数C语言的实现来说,它主要从位级角度来处理。

#include <stdio.h>

typedef unsigned char *bp;

show_bytes(bp start, size_t len)
{
	size_t i;
	for(i = 0;i < len;i++)
		printf(" %02x", start[i]);
	printf("\n");
}

int main(void)
{
	int integer = -1;
	unsigned ui = (unsigned) integer;
	printf("integer = %d\t\t", integer);
	show_bytes((bp) &integer, sizeof(int));
	printf("ui      = %u\t", ui);
	show_bytes((bp) &ui, sizeof(unsigned));
	
	return 0;
}

      它的运行结果如下:
result
      可见它转换时位值不变的,其中integer和ui的差的绝对值为2ω,如果integer为正数,那么ui的值的大小与integer是一样的,这毋庸置疑。

有符号数与无符号数之间的比较

#include <stdio.h>

int main(void)
{
	printf("         -1 < 0U            : %d\n", -1 < 0U);
	printf("2147483647U > -214748364 - 1: %d\n", 2147483647U > -214748364 - 1);

	return 0;
}

      运行结果如下:
result
      由此可知,无符号数与有符号数比较时,有符号数会被隐式强制转换为无符号。

有符号数与无符号数的扩展

      将无符号数转换为一个更大的数据类型,只要在位向量前添0即可,此为零扩展
      那么将有符号数转换为一个更大的数据类型,采用的是符号扩展,即在前面添加最高有效位的值。

#include <stdio.h>

typedef unsigned char *bp;

show_bytes(bp start, size_t len)
{
	size_t i;
	for(i = 0;i < len;i++)
		printf(" %02x", start[i]);
	printf("\n");
}

int main(void)
{
	short si = -12345;
	unsigned short usi = si;
	int integer = si;
	unsigned ui = usi;
	
	printf("     si = %d\t", si);
	show_bytes((bp) &si, sizeof(short));
	printf("    usi = %u\t", usi);
	show_bytes((bp) &usi, sizeof(unsigned short));
	printf("integer = %d\t", integer);
	show_bytes((bp) &integer, sizeof(int));
	printf("     ui = %u\t", ui);
	show_bytes((bp) &ui, sizeof(unsigned));
	
	return 0;
}

      运行结果如下:
result
      由于我的电脑采用的是小端法,si的十六进制表示为0xcfc7。零扩展应该是没有异议的,那么接下来我们来证明一下为什么这符号扩展没有问题。
      首先令扩展后的位为ω=ω+k,位向量由[xω-1, xω-2, …, x0]变为[xω-1, xω-1, xω-1, …, xω-1, xω-2, …, x0]。该位向量的值为
在这里插入图片描述
可以变为
在这里插入图片描述
由于二进制的特性,即[0100]2比[0010]2大一倍,因此可变为
在这里插入图片描述
该值与原来的位向量的值是一样的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值