[计算机组成原理]关于符号扩展的一个问题

 转载:https://blog.csdn.net/jianwei2016/article/details/88423154

在32位机器上输出si, usi, i, ui的十进制(真值)和十六进制值(补码机器数)是什么?
short si = -32768;
unsigned short usi = si;
int i = si;
unsingned ui = usi ;

以下为程序验证代码和结果:

#include <bits/stdc++.h>
using namespace std;

int main(){
    short si = -32768;
    unsigned short usi=si;
    int i = si;
    unsigned int ui=usi;
    printf("short:          decimal:%d  Hexadecimal:%x\n",si,si);
    printf("unsigned short: decimal:%d   Hexadecimal:%x\n",usi,usi);
    printf("int:            decimal:%d  Hexadecimal:%x\n",i,i);
    printf("unsigned int:   decimal:%d   Hexadecimal:%x\n",ui,ui);
    return 0;
}

验证结果:
验证结果

第一部分:关于整型数据符号扩展的基础知识:

一、短数据类型扩展为长数据类型

1.要扩展的短数据类型为有符号数

进行符号扩展,即短数据类型的符号位填充到长数据类型的高字节位(即比短数据类型多出的那一部分),保证扩展后的数值大小不变。

1:char x=10001001b; short y=x; 则y的值应为11111111 10001001b;
2:char x=00001001b; short y=x; 则y的值应为00000000 00001001b;

2.要扩展的短数据类型为无符号数

进行零扩展,即用零来填充长数据类型的高字节位。

1:unsigned char x=10001001b; short y=x; 则y的值应为00000000 10001001b;
2:unsigned char x=00001001b; short y=x; 则y的值应为00000000 00001001b;

二、长数据类型缩减为短数据类型

如果长数据类型的高字节全为1或全为0,则会直接截取低字节赋给短数据类型;如果长数据类型的高字节不全为1或不全为0,则转会就会发生错误。

三、同一长度的数据类型中有符号数与无符号数的相互转化

直接将内存中的数据赋给要转化的类型,数值大小则会发生变化。另短类型扩展为长类型时,但短类型与长类型分属有符号数与无符号数时,则先按规则一进行类型的扩展,再按本规则直接将内存中的数值原封不动的赋给对方。

第二部分:对于这个问题的解决

1.已知short类型的变量si = -32768,其二进制代码为1000,0000,0000,0000,十六进制为ffff8000
在转化为unsigned short类型的变量usi时属于同一长度的数据类型中有符号数与无符号数的相互转化,也就是会将数位进行压缩。

由上文的基础知识可以得知在转化的过程中si的最高位失去符号位意义,变为数据位所以转化后usi的十六进制为8000,即为32768.

为了更好解释上述回答我们将上述问题的数字改为-16,验证我们的结论

验证结果2
图中我们看见,-16的十六进制为fffffff0,转化为unsigned short后高位丢失,符号位意义丢失,最后取fff0为变量usi的值,为65520.

2.在转化为int类型时,属于短数据类型转化为长数据类型,且扩展的短数据类型为有符号数,所以进行符号扩展,即短数据类型的符号位填充到长数据类型的高字节位(即比短数据类型多出的那一部分),保证扩展后的数值大小不变。

原数字short si = 10000000,00000000
转化为int i = 11111111,11111111,10000000,00000000

进行符号扩展,数值大小不变

3.在转化为unsigned int类型时,属于短数据类型转化为长数据类型,且扩展的短数据类型为无符号数,所以进行进行零扩展,即用零来填充长数据类型的高字节位。

原数字unsigned short usi = 10000000,00000000
转化为unsigned int ui = 00000000,00000000,10000000,00000000

所以数值不变ui = 32768

参考文献

关于整型数据符号位扩展的问题
计算机组成原理(第2版),唐朔飞,高等教育出版社

猜你喜欢

转载自blog.csdn.net/modi000/article/details/113747859
今日推荐