
这上面说一个字段不允许跨越两个unsigned int 边界,不允许了为什么编译器会自动移动跨界字段,洞具体含义是什么捏搞不懂
说白了,就是空出一些内存,将下一个变量分配在下一个4的倍数的地址上,中间的没有用的内存,就是缝隙,也就是你这里说的洞
不知道你这个问题是否已经解决, 如果还没有解决的话:
- 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:从计算机数值存储角度看,int类型和unsigned类型数据的转化
- 除此之外, 这篇博客: 无符号数类型(unsigned)和 有符号数类型的区别中的 类型转换的规则 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
- 如果带符号类型前面加了unsigned int,那么就会变成无符号类型
- 当一个算术表达式中既有无符号数又有int值时,那个int值就会转换成无符号数,把int转换成无符号数的过程和把int直接赋给无符号变量一样
- 如果表达式里既有带符号数又有无符号数,带符号数会自动转换成无符号数
既然如此
unsigned a=-1;
std::cout<<a<<std::endl;
unsigned b=2;
std::cout<<b<<std::endl;
结果为

- 当我们给无符号类型赋给一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数
- 当我们给带符号类型赋给一个超出它表示范围的值时,结果是为定义的,此时程序可能崩溃,也可能继续工作,也可能生成垃圾数据
- 从数学角度
所谓无符号表示数值总数取模后的余数,
就是 (这个值加上无符号数的计量范围)%计量范围=输出结果
比如在在32位的编译器上,unsigned int 的最大值为4294967295,再加上0,一共4294967296个整数,即32位无符号数的模为4294967296(2^32)
a为-1 ,转换为32位无符号数为 4,294,967,295
b为2,转换为32位无符号数为2(4294967296+2=2)无符号int类型范围为0~4294967296
- 从计算机角度
首先要了解原码,补码,反码
原码:第一位为符号位,其余位表示数值,如-1的原码:1,000…0001(两个1之间32个0)。
反码:正数的补码就是其原码;负数的反码为符号位不变,数值位按位取反。如-1的补码为1,111…1110。
补码:正数的补码就是其原码。负数的补码为=反码+1。因此,-1的补码为1,111…111。
因此,unsigned(-1)=1,111…111(共32个1)。表示unsigned的最大值。
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^