为什么C++;已签名和未签名 我学习C++是因为多年来专业从事JavaScript。我知道有符号和无符号之间的区别,但我不知道为什么它们会存在。是为了表演还是什么 因为他们是需要的

为什么C++;已签名和未签名 我学习C++是因为多年来专业从事JavaScript。我知道有符号和无符号之间的区别,但我不知道为什么它们会存在。是为了表演还是什么 因为他们是需要的,c++,C++,signed类型的存在是因为有时需要使用负数 无符号类型的存在是因为对于某些操作,例如。G按位逻辑和移位,使用起来更简洁(例如,您不必担心符号位的表示方式等),因为它们是必需的 signed类型的存在是因为有时需要使用负数 无符号类型的存在是因为对于某些操作,例如。G按位逻辑和移位,使用起来更简洁(例如,您不必担心符号位的表示方式等)您可以认为,使用无符号值可以获得比使用等效符号类型更大的正范围,但主要原因是,它们允许在负数几乎没有意义或毫无意义的领域中映射概念。例如,容器的大小永远不能为负。通

signed
类型的存在是因为有时需要使用负数


无符号
类型的存在是因为对于某些操作,例如。G按位逻辑和移位,使用起来更简洁(例如,您不必担心符号位的表示方式等)

,因为它们是必需的

signed
类型的存在是因为有时需要使用负数


无符号
类型的存在是因为对于某些操作,例如。G按位逻辑和移位,使用起来更简洁(例如,您不必担心符号位的表示方式等)

您可以认为,使用无符号值可以获得比使用等效符号类型更大的正范围,但主要原因是,它们允许在负数几乎没有意义或毫无意义的领域中映射概念。例如,容器的大小永远不能为负。通过使用在类型中变为显式的无符号类型


然后,二者的存在,以及隐式转换带来了一系列完全不同的问题…

你可以说,使用无符号值可以获得比使用等效有符号类型更大的正范围,但主要原因是,它们允许在负数几乎没有意义或毫无意义的领域中映射概念。例如,容器的大小永远不能为负。通过使用在类型中变为显式的无符号类型


然后,二者的存在,以及隐式转换带来了一系列完全不同的问题…

对于需要描述长度的低级别情况,它非常有用,而长度显然不能是负的。例如,文件大小。

对于需要描述长度(显然不能为负)的低级别情况,它非常有用。例如,文件大小。

它们的存在是因为要处理的数学可能不同


考虑将两个32位值相乘以获得64位值。根据操作数的符号,有符号乘法和无符号乘法的高32位可能不同。说到汇编,这就是为什么x86上有IMUL和MUL指令。

它们的存在是因为要处理的数学可能不同


考虑将两个32位值相乘以获得64位值。根据操作数的符号,有符号乘法和无符号乘法的高32位可能不同。说到汇编,这就是为什么x86上有IMUL和MUL指令。

C被设计为高级语言,但也能够轻松地完成低级工作,例如使用_ASM关键字直接将汇编语言代码插入源代码。汇编语言直接处理CPU寄存器,算术指令处理有符号和无符号整数。变量类型的设计可能是这样的:值可以在CPU寄存器和变量之间传输,而无需任何转换。从C中扩展的C++也继承了这个特征。
毕竟,在C/C++发明的时候,大多数程序员也是硬件工程师。

C被设计成一种高级语言,但也能够轻松地完成低级工作,例如使用ASM关键字直接将汇编语言代码插入源代码。汇编语言直接处理CPU寄存器,算术指令处理有符号和无符号整数。变量类型的设计可能是这样的:值可以在CPU寄存器和变量之间传输,而无需任何转换。从C中扩展的C++也继承了这个特征。
毕竟,在C/C++发明的时候,大多数程序员也都是硬件工程师。

也许是表达能力?你可以反过来问为什么其他语言没有无符号类型。数组的大小当然是自然无符号的……一些整数变量如果可以是负数,那么它们就没有意义了,比如数组索引。它同时赋予您更多的含义和更多的范围。@RobertHarvey,这是一个设计缺陷。如果您需要数字为负数以表示超出范围,则不会如此。@SethCarnegie在C中,如何使用指向该字符串中间的指针引用该字符串中的前一个字符<代码>p[-1],当然……也许是表达能力?你可以反过来问为什么其他语言没有无符号类型。数组的大小当然是自然无符号的……一些整数变量如果可以是负数,那么它们就没有意义了,比如数组索引。它同时赋予您更多的含义和更多的范围。@RobertHarvey,这是一个设计缺陷。如果您需要数字为负数以表示超出范围,则不会如此。@SethCarnegie在C中,如何使用指向该字符串中间的指针引用该字符串中的前一个字符
p[-1]
,当然……是的,但是为什么它不能像处理任何其他int一样处理负数呢?这就是我困惑的地方。你的无符号解释对于低级操作是有意义的,这就是我认为这实际上非常重要的地方。@OscarGodson你说的“它不像其他任何int一样处理负数”是什么意思?是的。@OscarGodson 2的负数补码表示只是一个“实现细节”,也就是说,您甚至不知道值
-1
设置了所有位。有鉴于此,不可能允许负数具有已知且有用的表示形式。(通用的lisp标准走了另一条路,他们要求两个补码的“好像”规则)。@Oscar