鱼C论坛

 找回密码
 立即注册
查看: 1138|回复: 6

[已解决]给无符号类型赋值的问题

[复制链接]
发表于 2023-6-1 20:22:07 | 显示全部楼层 |阅读模式
10鱼币
当给无符号类型赋一个超出他表示范围的值时,结果是该值对无符号类型能够表示的总数取模后的余数。例如8位的unsigned char 可以表示0-255共256个值,为什么把-1赋给8位的unsigned char 得到的结果是255,这又是怎么计算的?负数又是如何对256取模的???麻烦有会的人帮忙解解答。
谢谢你!!!!
最佳答案
2023-6-1 20:22:08
在计算机中,负数是以补码形式存储的。对于8位整数来说,-1的补码形式是11111111。

而无符号数的存储方式没有符号位,所有的位都表示数值,所以当你将-1赋值给无符号数时,计算机将11111111视为无符号数来解读。

在无符号8位整数的表示范围内,11111111恰好对应的就是数值255,所以将-1赋值给无符号整数时,会得到255。

这其实不需要对256取模计算,因为无符号整数和有符号整数的存储方式是一样的,只是解读方式不同。无论是有符号整数还是无符号整数,他们的存储方式都是二进制。只不过对于有符号整数,最高位是符号位,而对于无符号整数,所有位都是数值位。

关于你的问题"负数又是如何对256取模的?",其实你可以将其理解为二进制补码的转换。负数的补码是其对应正数的补码按位取反后加1,而在8位整数中,1的补码是00000001,所以-1的补码是按位取反后加1,即11111110+1=11111111,这就是为什么-1对256取模的结果是255。

最佳答案

查看完整内容

在计算机中,负数是以补码形式存储的。对于8位整数来说,-1的补码形式是11111111。 而无符号数的存储方式没有符号位,所有的位都表示数值,所以当你将-1赋值给无符号数时,计算机将11111111视为无符号数来解读。 在无符号8位整数的表示范围内,11111111恰好对应的就是数值255,所以将-1赋值给无符号整数时,会得到255。 这其实不需要对256取模计算,因为无符号整数和有符号整数的存储方式是一样的,只是解读方式不同。无 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-1 20:22:08 | 显示全部楼层    本楼为最佳答案   
在计算机中,负数是以补码形式存储的。对于8位整数来说,-1的补码形式是11111111。

而无符号数的存储方式没有符号位,所有的位都表示数值,所以当你将-1赋值给无符号数时,计算机将11111111视为无符号数来解读。

在无符号8位整数的表示范围内,11111111恰好对应的就是数值255,所以将-1赋值给无符号整数时,会得到255。

这其实不需要对256取模计算,因为无符号整数和有符号整数的存储方式是一样的,只是解读方式不同。无论是有符号整数还是无符号整数,他们的存储方式都是二进制。只不过对于有符号整数,最高位是符号位,而对于无符号整数,所有位都是数值位。

关于你的问题"负数又是如何对256取模的?",其实你可以将其理解为二进制补码的转换。负数的补码是其对应正数的补码按位取反后加1,而在8位整数中,1的补码是00000001,所以-1的补码是按位取反后加1,即11111110+1=11111111,这就是为什么-1对256取模的结果是255。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-1 20:25:35 | 显示全部楼层
当给无符号类型(如unsigned char)赋一个超出它们的表示范围的值时,C++标准定义了该行为的后果是模数截断,并且回收其结果:对于一个无符号整数类型,如果其能够表示的值是0到N-1,其中N是2的k次幂,那么对M取模会产生0到N-1之间的余数,其中M = k * 8 (对于char或者字节数组而言)。

在你的例子中,unsigned char变量可以表示0到255范围内的256个值。当把-1赋给它时,由于该类型是无符号类型,-1会被解释为 unsigned int 类型的最大值,也就是255,因此结果为255。

当计算负数对256的模时,通常会将其转换成相应的正数再进行计算。这是因为在二进制补码表示法中,负数的表示是使用正数的补码(即所有位取反并加1),所以将负数转换为正数实际上只需要对其补码求反操作并加1。例如,-1的补码是11111111(当考虑一个8位的char或者一个字节时),其反码为11111110,它加1等于11111111,即unsigned char的最大值255。

求最佳答案

点评

我很赞同!: 5.0
我很赞同!: 5
  发表于 2023-6-1 20:48
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-1 20:38:52 From FishC Mobile | 显示全部楼层
问题描述的处理算法与标准有出入,相对准确的描述可以看这里
https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=215834&pid=5907829

点评

我很赞同!: 5.0
我很赞同!: 5
  发表于 2023-6-1 20:47
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-1 20:42:51 | 显示全部楼层
dolly_yos2 发表于 2023-6-1 20:38
问题描述的处理算法与标准有出入,相对准确的描述可以看这里
https://fishc.com.cn/forum.php?mod=redirec ...

我不知道哎,我是照书抄下来的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 21:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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