刚接触c,看书的时候遇到了疑惑

img


我不明白(2)的例如:变量a被说明为unsigned类型,在进行a=-1的赋值操作后将使a中的值为65535
为啥就使a变为65535了

  • 首先 一般 整型是 4个字节的, 32位二进制,显然最大值 不止 65535,你这里应该当作 16位算,整型的最大值就为 65535
  • 下面来分析下 有符号整型-1 ,负数存储在内存的中数据是补码,第一位为符号位,剩下15位 为数据位,
    这里 -1 的 补码就是 1000 0000 0000 0001;
    它的 反码 就是 补码减1,即 1000 0000 0000 0000;
    它的源码就是 反码 取反,即 1111 1111 1111 1111
  • 然后这个数赋值给了 无符号整型【还是按16位算】,也就是 -1的源码对应的数,直接转换成无符号整型, 这个数就是 65535

img

  • 这篇文章讲的很详细,请看:输入一个字符串,内有数字和非数字,例如:A123x456 17960,将其中连续的数字作为一个整数,依次放到一数组a中。例如,123放在a[0],456放在a[1],统计共有多少个整数,并输出这些数。
  • 除此之外, 这篇博客: 【顺序表】顺序表定位中的 在学习C语言的时候,相信大家应该都做过这样一个题:判断数组a[]中是否存在元素x,若存在,则返回下标,否则返回-1。是否有印象呢??? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 这两个题本质一模一样,唯一不同的是本题利用“顺序表”将数组a[]包装了起来。在遍历的过程中,拿顺序表的数据去和x比对,若相同,返回当前下标值,若到了最后一个数据元素都不相同,就返回-1


  • 以下回答由chatgpt基于相关博客总结生成:

    题目中提到当一个变量a被说明为unsigned类型时,在进行a=-1的赋值操作后,会使a中的值变为65535。这是因为无符号整型变量在底层是以二进制补码的形式存储的。当一个有符号整数为-1时,在计算机中以补码形式表示为全部位取反再加1,即1111 1111,而无符号整型变量不考虑符号位,将其全部位都当作数值位,所以当将-1赋值给unsigned类型的变量时,二进制补码1111 1111会被解释为无符号整型的65535。

    针对给出的参考资料,对于问题的具体解决方案如下:

    #include <stdio.h>
    
    int main() {
        unsigned int a;  // 声明一个无符号整型变量a
        a = -1; // 将-1赋值给a
    
        printf("%u\n", a);  // 输出a的值,预期结果为65535
        return 0;
    }
    

    在这个代码中,我们只需要声明一个无符号整型变量a,并将-1赋值给a,然后使用printf函数输出a的值即可。由于printf函数使用格式化控制符%u来输出无符号整型变量的值,所以输出结果为65535。

    需要注意的是,这里采用了%u来格式化输出,因为无符号整型变量是以无符号十进制的形式输出的,而不是以带符号的形式输出。