这上面说一个字段不允许跨越两个unsigned int 边界,不允许了为什么编译器会自动移动跨界字段,洞具体含义是什么捏搞不懂

img

这上面说一个字段不允许跨越两个unsigned int 边界,不允许了为什么编译器会自动移动跨界字段,洞具体含义是什么捏搞不懂

说白了,就是空出一些内存,将下一个变量分配在下一个4的倍数的地址上,中间的没有用的内存,就是缝隙,也就是你这里说的洞

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 给你找了一篇非常好的博客,你可以看看是否有帮助,链接:从计算机数值存储角度看,int类型和unsigned类型数据的转化
  • 除此之外, 这篇博客: 无符号数类型(unsigned)和 有符号数类型的区别中的 类型转换的规则 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    1. 如果带符号类型前面加了unsigned int,那么就会变成无符号类型
    2. 当一个算术表达式中既有无符号数又有int值时,那个int值就会转换成无符号数,把int转换成无符号数的过程和把int直接赋给无符号变量一样
    3. 如果表达式里既有带符号数又有无符号数,带符号数会自动转换成无符号数

    既然如此

    unsigned a=-1;
    std::cout<<a<<std::endl;
    unsigned b=2;
    std::cout<<b<<std::endl;
    

    结果为
    在这里插入图片描述

    • 当我们给无符号类型赋给一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数
    • 当我们给带符号类型赋给一个超出它表示范围的值时,结果是为定义的,此时程序可能崩溃,也可能继续工作,也可能生成垃圾数据
    1. 从数学角度
      所谓无符号表示数值总数取模后的余数,
      就是 (这个值加上无符号数的计量范围)%计量范围=输出结果

    比如在在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的原码:1,000…0001(两个1之间32个0)。
      反码:正数的补码就是其原码;负数的反码为符号位不变,数值位按位取反。如-1的补码为1,111…1110。
      补码:正数的补码就是其原码。负数的补码为=反码+1。因此,-1的补码为1,111…111。
      因此,unsigned(-1)=1,111…111(共32个1)。表示unsigned的最大值。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^