鱼C论坛

 找回密码
 立即注册
查看: 2104|回复: 4

[已解决]求解答S1E7动动手作业0的几个疑惑

[复制链接]
发表于 2022-8-1 00:03:57 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.signed char的最大值是127,那为什么给i赋值255却不会报错?

2.给一个变量赋值,是不是相当于把数值转换为二进制存储起来?
输出变量的值,是不是相当于逆过来,把存储的二进制转换为对应的值?

3.能否请大佬们讲一下,图中“十进制的255”,具体是怎么转换为“signed char类型的-1”的?
最佳答案
2022-8-1 09:14:21
1. 因为您使用的 C 语言实现没有报错
2. 基本可以这样理解
3. 没有标准的回答,和您使用的实现相关,因此这个题目实际上不足够严谨

关于标准中对此类转换的规定,可以参考我在先前的一个帖子,《取值超出范围后是怎么算的?》【 thread-215834-1-1 】七楼中的回复。在这里简单的说,不考虑 _Bool 类型,将数值转换到无法表示之的无符号类型的结果是标准定义的,但转换到无法表示之的有符号类型的效果是实现定义的,或者说编译器想产生任何结果都是符合标准的,包括“报错”( an implementation-defined signal is raised )。
至于具体得到某种结果的原因(计算方式),需要参考对应实现的说明。例如 GCC 在其手册关于实现定义行为的部分是这样说明的
The result of, or the signal raised by, converting an integer to a signed integer type when the value cannot be represented in an object of that type (C90 6.2.1.2, C99 and C11 6.3.1.3).
For conversion to a type of width N, the value is reduced modulo 2^N to be within range of the type; no signal is raised.
Screenshot_2022-07-31-23-20-49.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-1 00:35:58 | 显示全部楼层
1,确实没有报错,但是你可以看看输出结果,明显是出错了
2,赋予一个变量值就是把这个值以数字的形式存储在内存里,毕竟计算机都是使用二进制的,所以你可以这么理解
3,因为出错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-1 00:41:48 From FishC Mobile | 显示全部楼层
本帖最后由 164342146 于 2022-8-1 00:48 编辑

至于第二个问题,可以这么理解,而且不只是数值,赋值的内容就算是字符最终也是以进制表示,第一第三个问题,255对应11111111(第一个1是表示为负数而不是128,表示128的1溢出了),补码10000001,就是-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-1 01:02:48 | 显示全部楼层
第3问,C99好像有讲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-1 09:14:21 | 显示全部楼层    本楼为最佳答案   
1. 因为您使用的 C 语言实现没有报错
2. 基本可以这样理解
3. 没有标准的回答,和您使用的实现相关,因此这个题目实际上不足够严谨

关于标准中对此类转换的规定,可以参考我在先前的一个帖子,《取值超出范围后是怎么算的?》【 thread-215834-1-1 】七楼中的回复。在这里简单的说,不考虑 _Bool 类型,将数值转换到无法表示之的无符号类型的结果是标准定义的,但转换到无法表示之的有符号类型的效果是实现定义的,或者说编译器想产生任何结果都是符合标准的,包括“报错”( an implementation-defined signal is raised )。
至于具体得到某种结果的原因(计算方式),需要参考对应实现的说明。例如 GCC 在其手册关于实现定义行为的部分是这样说明的
The result of, or the signal raised by, converting an integer to a signed integer type when the value cannot be represented in an object of that type (C90 6.2.1.2, C99 and C11 6.3.1.3).
For conversion to a type of width N, the value is reduced modulo 2^N to be within range of the type; no signal is raised.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-21 13:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表