首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C语言中8位数的算术运算过程

C语言中8位数的算术运算过程
EN

Stack Overflow用户
提问于 2019-09-01 15:14:02
回答 1查看 264关注 0票数 1

当我们对8位数执行算术运算时,它们被提升为整数。下面有代码片段。

代码语言:javascript
运行
复制
unsigned char startTime=7;
unsigned char endTime=5;  
unsigned char diff = endTime-startTime;

我知道,在RHS中,两者都被提升为整数,因此结果是-2,最后的结果是254。我想知道编译器是如何做到这一点的。这是我的感受,但不确定。编译器将两者提升为整数。为结果创建临时整数变量。执行算术运算。结果5-7 = 0xFFFF FFFF FFFF FFFE。现在,只分配8位0xFE到LHS,所有较高的3个字节被剥离。因此,如果我们打印它,我们就会看到254。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-01 15:44:19

正如您注意到的,startTimeendTime被提升为intendTime-startTime的结果是−2。C标准根据结果的描述这种行为,即−2。它没有用编码结果的来描述该行为;它不要求用位111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

在许多C实现中,基本上所有常见的现代实现,这两种补码系统都用于有符号整数,其中−2的32位表示形式是11111111111111111111111111111111111111111110。但C标准也允许使用补语(其中−2为111111111111111111111111111101)或符号级(−2为10000000000000000000000000000010)。

无论使用哪个系统,将unsigned char 2转换为8位unsigned char的结果是254个.(C允许unsigned char大于8位,但这个答案并不能解决这个问题。)这是因为C标准指定将整数值转换为unsigned char的结果是unsigned char类型域中的值,该值是通过反复添加或减去UCHAR_MAX+1获得的。也就是说,它是被转换为模块256的值。对于−2,我们有−2 + 256 = 254,所以C标准要求的结果是254。

因为这个结果是C标准要求的,无论是使用两个补码,一个补码,还是符号和大小,C编译器(或整个C实现)负责做任何必要的事情来获得这个结果。当使用两个补码时,编译器所要做的就是将int表示的低八位作为unsigned char表示的位。这也是今天人们青睐两人补语的原因之一。如果C实现使用的是一个人的补码或符号大小,那么它将负责做任何必要的工作,将int 2−值转换为254个unsigned char值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57747189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档