关于一道2011年计算机考研408真题疑问。假定在一个8位字长的计算机中运行如下C程序段:具体如下

假定在一个8位字长的计算机中运行如下C程序段:unsignedintx=134;unsignedinty=246;intm=x;intn=y;unsignedintz1=... 假定在一个8位字长的计算机中运行如下C程序段:
unsigned int x=134;
unsigned int y=246;
int m=x;
int n=y;
unsigned int z1=x-y;
unsigned int z2=x+y;
int k1=m-n;
int k2=m+n;
若编译器编译时将8个8位寄存器R1-R8分别分配给变量x、y、m、n、z1、z2、k1、k2,请回答下列问题(提示:带符号整数用补码表示)
2)执行上述程序段后,变量m、k1的值分别是多少(用十进制表示)
正确解答:m的机器数与x的机器数相同,皆为86H=1000 0110B,解释为带符号整数m(用补码表示)时,其值为-111 1010B=-122。m-n的机器数与x-y的机器数相同,皆为90H=1001 0000B,解释为带符号整数k1(用补码表示)时,其值为-111 0000B=-112。

我的问题:按照解答思路,m、n被强制转化为有符号数,则m的原码为1000 0110,补码为1111 1010,n的原码为1111 0110,补码为1000 1010,【-n】补=0111 0110,【m-n】补=【m】补+【-n】补=1111 1010+0111 0110=(1)0111 0000,算出来的值为112,与题目相差了一个符号,并且,两个负数相减,绝对值小的数减大的数理论上计算结果应该是正的,那么问题出在哪里了呢?
展开
 我来答
一剑出血
高粉答主

2016-07-31 · 醉心答题,欢迎关注
知道大有可为答主
回答量:5.7万
采纳率:78%
帮助的人:1.7亿
展开全部
感觉你对于C语言中数据的存储原理根本没有吃透,整个计算过程全都走偏了。
x是八位无符号数,在内存中存储为0x86;强制赋给八位有符号数m的时候,该数值不转换、直接赋给m,0x86按照八位补码相当于(-122)10;
同理,y是八位无符号数,在内存中存储为0xE6;强制赋给八位有符号数n的时候同样是硬塞的,对于n来说0xE6按照八位补码相当于(-10)10。

你说“绝对值小的数减大的数理论上计算结果应该是正的”,问题是m的绝对值远大于n啊……
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式