Binary 计算机如何在2';补语

Binary 计算机如何在2';补语,binary,numbers,cpu,computer-science,Binary,Numbers,Cpu,Computer Science,(我的问题只与2的补语有关) 假设我给你这个二进制数11111110,它作为2的补码存储在机器上,我想让你找到它的十进制等价物。有些人可能会说它是-2,而有些人可能会说它是254,因为他们不知道它是有符号的还是无符号的。(我知道这是一个有符号的数字,所以我把它的补码加上1,得到了2,所以答案是-2。但如果我不知道这个符号,我会说254) 简言之,计算机如何将存储在2的补码中的二进制表示形式转换为十进制表示形式而不出错 计算机知道它的标志吗?(如果是,那么这些信息存储在哪里?从技术上讲,您不能将二

(我的问题只与2的补语有关)

假设我给你这个二进制数11111110,它作为2的补码存储在机器上,我想让你找到它的十进制等价物。有些人可能会说它是-2,而有些人可能会说它是254,因为他们不知道它是有符号的还是无符号的。(我知道这是一个有符号的数字,所以我把它的补码加上1,得到了2,所以答案是-2。但如果我不知道这个符号,我会说254)

简言之,计算机如何将存储在2的补码中的二进制表示形式转换为十进制表示形式而不出错


计算机知道它的标志吗?(如果是,那么这些信息存储在哪里?

从技术上讲,您不能将二进制表示的数字转换成十进制,因为计算机没有任何存储设备来表示十进制数字

实际上,这听起来可能很荒谬,因为我们总是用十进制来处理数字。但这些十进制表示法实际上从未存储在十进制中。计算机所做的唯一一件事就是在显示数字时将其转换为十进制表示。这种转换与程序构建和库设计有关

我将给出一个关于C语言的小例子。在C语言中,有符号和无符号整数变量。编写程序时,这些变量用于在内存中存储数字。谁知道他们的迹象?编译器。汇编语言具有有符号和无符号操作。编译器跟踪所有变量的符号,并为有符号和无符号大小写生成适当的代码。因此,您的程序在编译时可以完美地处理有符号或无符号整数

假设您使用
printf
语句打印整数变量,并使用
%d
格式转换器以十进制表示打印值。此转换将由C标准输入输出库中定义的
printf
函数处理。该函数从内存中读取变量,使用简单的基转换算法将二进制表示转换为十进制表示。但该算法的目标是字符序列,而不是整数。所以这个算法做了两件事,它都把二进制转换成十进制表示;它将位转换为字符值(更精确地说是ASCII码)
printf
应该知道数字的符号才能成功地进行转换,并且该信息再次由编译时放置的编译器构造提供。通过使用这些构造,printf可以检查整数是有符号的还是无符号的,并使用适当的转换方法


其他编程语言遵循类似的路径。本质上,数字总是以二进制形式存储的。编译器/解释器知道有符号或无符号表示,因此这是一个常识。十进制转换仅出于表面原因而进行,转换的目标是字符序列或字符串。

这是因为当您指定要使用带符号的数字时,计算机会将第一位
[1]111111 0
解释为从其余位
1[111111 0]
生成的数字的符号。因此,1表示-而0表示+; “char”可以存储-127到127之间的数字;
“无符号字符”可以存储0到255之间的数字

谢谢,这是一个很高的级别,但是如果我写了一个基本的引导加载程序来打印一个负数(这个数字显然存储在内存中0x7c00之后的某个位置的2的补码中),如果我不告诉CPU它的符号,那么他(CPU)肯定会打印错误呢?我仍然不明白:(@dimSutar当你从图片中移除操作系统的电源时,类似的逻辑仍然存在。CPU有关于有符号和无符号数字的指令,同样BIOS可以将有符号或无符号数字放到屏幕上。所以你必须告诉CPU和BIOS使用的正确形式。某人(你或其他人)把那个负数记在内存中。那个家伙还应该公布存储数字时使用的符号约定。没有它,你就无法知道,你只能猜测。通常使用的约定与常识相一致。例如,视频卡品牌代码永远不会被签名。