问题描述
就存储而言,unsigned int
和 signed int
是否具有任何相关性。我知道它在打印语句中具有相关性,即; -1
将被视为 4294967295
(%d
和 %u
)。如果我们只考虑值的存储,那么 unsigned
或 signed
会有所不同吗?
解决方法
在 C 中,没有类型就不能有值。 (各种运算都是根据数学值定义的,但每个运算都被指定为产生特定类型的结果,因此,在 C 表达式中存在值的每个点处,它都有一个类型。)所以任何值都是通过存储表示它的对象的字节来存储。
C 2018 标准在 6.2.6 中指定了类型的表示,在 6.2.6.2 中具体指定了整数类型的表示。对象由一位或多位组成。无符号整数用纯二进制加上可选的填充位表示。未指定位的顺序。对于有符号整数类型,其中一位是符号位,每个值位与相应无符号类型的同一位具有相同的值。无符号类型中的某些值位可能是有符号类型中的填充位(未用于值)。 (但总位数是相同的,每 6.2.5 6。)符号位要么表示该值被取反,要么表示该值 -(2M ) 或 -(2M-1),其中 M 是值位数。 (这三个中的哪一个是实现定义的。)
因此,整数类型是有符号还是无符号对于公共值位的解释没有区别。它只影响对无符号类型中的值位但有符号类型中的符号位或填充位的解释。 (后者很少见。)
如果有符号整数类型中的值与其对应的无符号整数类型中的值相同,则它们的每个公共值位都具有相同的值,而所有非共享符号或值位中的值都为零。 (C 标准未指定填充位。)