alin79 发表于 2023-6-1 20:22:07

给无符号类型赋值的问题

当给无符号类型赋一个超出他表示范围的值时,结果是该值对无符号类型能够表示的总数取模后的余数。例如8位的unsigned char 可以表示0-255共256个值,为什么把-1赋给8位的unsigned char 得到的结果是255,这又是怎么计算的?负数又是如何对256取模的???麻烦有会的人帮忙解解答。
谢谢你!!!!

isdkz 发表于 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。

sfqxx 发表于 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。

求最佳答案

dolly_yos2 发表于 2023-6-1 20:38:52

问题描述的处理算法与标准有出入,相对准确的描述可以看这里
https://fishc.com.cn/forum.php?mod=redirect&goto=findpost&ptid=215834&pid=5907829

alin79 发表于 2023-6-1 20:42:51

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

我不知道哎,我是照书抄下来的
页: [1]
查看完整版本: 给无符号类型赋值的问题