脱碳葡萄糖 发表于 2022-8-1 00:03:57

求解答S1E7动动手作业0的几个疑惑

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

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

3.能否请大佬们讲一下,图中“十进制的255”,具体是怎么转换为“signed char类型的-1”的?

liuzhengyuan 发表于 2022-8-1 00:35:58

1,确实没有报错,但是你可以看看输出结果,明显是出错了
2,赋予一个变量值就是把这个值以数字的形式存储在内存里,毕竟计算机都是使用二进制的,所以你可以这么理解
3,因为出错了

164342146 发表于 2022-8-1 00:41:48

本帖最后由 164342146 于 2022-8-1 00:48 编辑

至于第二个问题,可以这么理解,而且不只是数值,赋值的内容就算是字符最终也是以进制表示,第一第三个问题,255对应11111111(第一个1是表示为负数而不是128,表示128的1溢出了),补码10000001,就是-1

额外减小 发表于 2022-8-1 01:02:48

第3问,C99好像有讲

dolly_yos2 发表于 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.
页: [1]
查看完整版本: 求解答S1E7动动手作业0的几个疑惑