计算机酷学(五)

计算机酷学(五)学点计算机——信息的处理和表示(三)数字(三)有符号数与无符号数之间的转换有符号数与无符号数之间的比较无符号数与有符号数的扩展数字(三)有符号数与无符号数之间的转换对于大多数C语言的实现来说,它主要从位级角度来处理。#includestdio.htypedefunsignedchar*bp;show_bytes(bpstart,size_tlen){ size_ti; for(i=_shortsi

大家好,欢迎来到IT知识分享网。

学点计算机——信息的处理和表示(三)

  • 数字(三)
    • 有符号数与无符号数之间的转换
    • 有符号数与无符号数之间的比较
    • 有符号数与无符号数的扩展

数字(三)

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

      对于大多数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大一倍,因此可变为
在这里插入图片描述
该值与原来的位向量的值是一样的

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/27445.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信