负数是如何从内存中读取出来的?C语言中数据是以补码的形式在内存中存储的,正数的补码就是其二进制数,负数
负数是如何从内存中读取出来的?
C语言中数据是以补码的形式在内存中存储的,正数的补码就是其二进制数,负数的补码经过如下计算过程:
1.将负数取绝对值,转换其绝对值为对应的二进制数;
2.最高位(符号位)变为1;
3.数值位取反(1变为0,0变为1);
4.最低位加1。
问题:当需要从内存中读取一个负数时,是不是需要将内存中的二进制数进行补码的逆运算(4-->3-->2-->1)才能读取出来? 内存 二进制 C 负数 补码
[解决办法]
如果不进行补码的逆运算而直接读出来的话就是-2147483647(除最高位作为符号位外,其余31位数值位全部转换为十进制数)
这个不对,-1直接读出来还是1111 ... 1111,如果最高位作为符号位,那它就是一个有符号类型,如果是负数,其余31位数[color=#0000FF]不能直接转换为十进制数,要用上面的步骤把它转成实际的数,也就是-1,不是你说的-2147483647[/color]
所以,内存中数值对计算机中来说是没区别的,-1以111.。。111存储,取出来就是0xfffffff,至于这个数表示什么,要看你对它的解释,如果解释成int类型,则是-1,如果解释成无符号int类型,则是4294967295。
int main()
{
int a = -1;
int b = 0;
unsigned int ui = 0;
b = a;
ui = a;
printf("a = %x, b = %x, ui = %x\n", a, b, ui); // a=ffff ffff, b=ffff ffff, ui = ffff ffff
printf("%d\n", b); // -1
printf("%u\n", ui); // 4294967295
return 0;
}
[解决办法]
也不需要。。32位太多就拿8位说把,二进制转10进制
补码只要把最高位的权重设置为负值就行了
(11111111)2 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = (-1)10
[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
