03-C语言变量和数据类型

plana_lab 发布于 14 天前 16 次阅读


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 signedcharerjzhi

在 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

此作者没有提供个人介绍。
最后更新于 2026-08-19