我是否正确地说有符号和无符号整数之间的区别是:
无符号可以保持较大的正值,而不是负值.
无符号使用前导位作为值的一部分,而带符号版本使用最左侧位来标识数字是正数还是负数.
有符号整数可以包含正数和负数.
还有其他差异吗?
无符号可以保持较大的正值,而不是负值.
是.
无符号使用前导位作为值的一部分,而带符号版本使用最左侧位来标识数字是正数还是负数.
表示有符号整数的方法有很多种.最容易想象的是使用最左边的位作为标志(符号和幅度),但更常见的是两个补码.两者都在大多数现代微处理器中使用 - 浮点使用符号和幅度,而整数运算使用二进制补码.
有符号整数可以包含正数和负数.
是
我将在x86上的硬件级别上进行分析.除非您正在编写编译器或使用汇编语言,否则这几乎无关紧要.但很高兴知道.
首先,X86具有原生的支持二进制补码符号数的表示.您可以使用其他表示形式,但这需要更多指令,通常会浪费处理器时间.
"原生支持"是什么意思?基本上我的意思是你有一组用于无符号数字的指令和另一套用于有符号数字的指令.无符号数字可以与有符号数字位于相同的寄存器中,实际上,您可以混合有符号和无符号指令,而无需担心处理器.由编译器(或汇编程序员)来跟踪数字是否已签名,并使用适当的指令.
首先,二进制补码数具有加法和减法与无符号数相同的特性.数字是正数还是负数没有区别.(所以你只需要继续,ADD
并且SUB
不用担心你的数字.)
在进行比较时,差异开始显现.x86有一种区分它们的简单方法:上/下表示无符号比较,大于/小于表示已签名比较.(例如,JAE
"如果大于或等于跳跃"并且是未签名的.)
还有两组乘法和除法指令来处理有符号和无符号整数.
最后:如果你想检查溢出,你会对签名和无符号数做不同的处理.
基本上他只询问签名和未签名.不知道为什么人们会在这里添加额外的东西.我来告诉你答案.
无符号:仅包含正值,即0到255.
签名:它包含负值和正值,但有不同的格式,如
-1到-128
0到+127
这一切都是关于8位数系统的解释.
完整性只需几点:
这个答案只讨论整数表示.浮点可能还有其他答案;
负数的表示可以变化.今天使用的最常见的(到目前为止 - 它几乎是通用的)是两个补充.其他表示包括一个补码(非常罕见)和有符号的幅度(很少见 - 可能仅用于博物馆作品),它只是使用高位作为符号指示符,其余位代表数字的绝对值.
当使用二进制补码时,变量可以表示比正数更大的负数范围(乘以1).这是因为"正"数字中包含零(因为符号位未设置为零),而不是负数.这意味着无法表示最小负数的绝对值.
当使用一个补码或有符号幅度时,您可以将零表示为正数或负数(这是通常不使用这些表示的几个原因之一).
根据我们在课堂上学到的东西,有符号整数可以表示正数和负数,而无符号整数只是非负数.
例如,查看一个8位数字:
无符号值0
来255
签署值的范围从-128
到127
除第2点以外的所有内容都是正确的.签名整数有许多不同的符号,一些实现使用第一个,其他实现使用最后一个,而其他实现使用完全不同的东西.这一切都取决于您正在使用的平台.
另一个区别是当您在不同大小的整数之间进行转换时.
例如,如果要从字节流中提取整数(为简单起见,则为16位),使用无符号值,您可以执行以下操作:
i = ((int) b[j]) << 8 | b[j+1]
(应该可能会转换第二个字节,但我猜测编译器会做正确的事情)
使用签名值,您将不得不担心签名扩展并执行:
i = (((int) b[i]) & 0xFF) << 8 | ((int) b[i+1]) & 0xFF