signed和unsigned
一般来说,对于int类型,不做声明下,默认是signed int,由于是默认情况,所以signed不写
signed 和 unsigned的区别
- signed:一个类型带有正负号,且包含负值
- unsigned:该类型不包括正负号,只能表示0和正整数
整数变量声明为unsigned的好处是:同样长度的内存可以表示的最大整数值大了一倍
使用例:
在8位下的 unsigned char的取值范围是:0 ~ 255 (MAX=255)
signed char的取值范围是:-128 ~ 127 (MAX=127)
证明
在x64下的char类型为例:
char = 1字节 = 8bit
十进制:123 = 1102+2*101+310^0
二进制:0101 = 0 × 2³ + 1 × 2² + 0 × 2¹ + 1 × 2⁰ = 5 

在 signed char 中

符号位:用来判定正负值 其中符号位为0时是正数,符号位为是负数
所以,在signed char中 最大值是 0 1 1 1 1 1 1 1 = = 64+32+16+8+4+2+1 = 127
在 unsigned char 中

所以,在unsigned char中 最大值是 1 1 1 1 1 1 1 1 = = 128+64+32+16+8+4+2+1 = 255 所以,在unsigned char中 最小值是 0 0 0 0 0 0 0 0 = 0
在 signed char 中该如何存储负数呢
在计算机科学中,原码、反码和补码是数字表示方法,它们用于简化计算机中数字的算术运算,尤其是二进制数的加减运算
原码(Sign-Magnitude) 概念:
原码是一种最简单的表示有符号数的方法。 使用最高位(最左边的一位)表示符号:0表示正数,1表示负数。 其余位表示数值的大小。 规则:
对于正数:原码的表示与其二进制值相同。 对于负数:将其绝对值的二进制表示取原码,并将最高位设置为1(表示负数)。 示例:
8位原码表示: +5:00000101
-5:10000101 反码(Ones’ Complement) 概念:
反码是通过对原码的数值部分逐位取反(0变1,1变0)得到的。 正数的反码和原码相同。 负数的反码是其原码除符号位外所有位取反。 规则:
对于正数,反码与原码相同。 对于负数,反码是将原码中所有位(除了符号位)取反,即将每个二进制位从 0 改为 1,或者从 1 改为 0。 示例:
8位反码表示: +5:00000101
-5:11111010 补码(Two’s Complement) 概念:
补码是反码加1得到的。 正数的补码和原码相同。 负数的补码是其反码加1。 规则:
对于正数,补码与原码相同。 对于负数,补码是将反码加 1。 示例:
8位补码表示: +5:00000101
-5:11111011(反码为11111010,加1得到11111011)
计算机存储负数时存储的是补码
为什么计算机不用原码表示负数?
一个非常简单的例子:
5 + (-5)
如果使用原码:
00000101
10000101
直接相加并不能得到理想结果。
所以才需要一种更适合计算机进行加减法的表示方式——补码。
但对于初学者,-1 是最直观的例子:
+1 00000001
-1 11111111
然后:
00000001 + 11111111 ──────── 100000000
8 bit 只能保留:
00000000
也就是:
1 + (-1) = 0
Comments NOTHING