大家好,欢迎来到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;
}
它的运行结果如下:
可见它转换时位值是不变的,其中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;
}
运行结果如下:
由此可知,无符号数与有符号数比较时,有符号数会被隐式强制转换为无符号。
有符号数与无符号数的扩展
将无符号数转换为一个更大的数据类型,只要在位向量前添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;
}
运行结果如下:
由于我的电脑采用的是小端法,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