整数在内存中的存储形式,我怎么不懂啊

来源:百度知道 编辑:UC知道 时间:2024/06/23 08:18:46
比如:
main()
{unsigned int a;
int b=-1;
a=b
printf(“%u”,a);

程序运行后输出的结果为什么是65535
我实在不懂11111111111111111怎么和-1是一回事,,又为什么是65535

这和二进制有关系,如果你不深入了解2进制,就很难彻底明白;

因为整形数据在内存中是以2进制本数的补码存在的;但正整数的补码还是原来的2进制,而负数则要先取反再+1才是它的补码,(+1后的最左边以为就是符号位,1为负,0为正;)比如-10的二进制: 1、先取-10的绝对值的二进制数值,为0000000000001010; 2、取反,1111111111110101 3、加1:1111111111110110; 这个就是-10在内存中的储存形式;

而你用的是%u,无符号输出;则就把 上面第3步的二进制直接转化为十进制;

若有符号输出;就先判断最左边一位若为1,则是负数,就按相反步骤还原;就是-10

你要是不会将十进制转化为2进制,就不会彻底明白; 先学会他的简单运算吧;
对你有帮助!

由于b 是有符号数 所以-1在内存中以补码的形式存储 [-1]原码=1000000000000001第一位使符号位 1为负数 所以[1]原码=0000000000000001
原码变补码的规则是 除符号位以外 按位取反[-1]反码=1111111111111110
再加1 得补码 既[-1]补码=1111111111111111 由于a是无符号数 所以当a内存里被赋值为1111111111111111 第一位不在是符号位 所以作为数值计算在书中得到65535

这是无符号整行。-1是不符合无符号整行。所以反转了这个数。也就是65535

不明白加我百度HI

请上网查询"补码"

补码