数的表示
无符号整数和有符号整数
当一个编码的所有二进位都用来表示数值,而没有符号位时,该编码表示的就是无符号整数,此时默认为正。
带符号整数就是必须有一个符号位。
正由于此相同位数情况下,无符号数比带符号数所能表示的范围大。(不作解释)
标准问题
在有些32位系统上,C语言表达式“-2147483648 < 2147483657” 的值为false,与事实不符。但是如果 “int i = -2147483648;” 那么“i < 2147483647”的值为true,为什么会这样?如果将表达式写成“-2147483648 - 1 < 2147483647” ,它的值又该如何?
这个问题是出现在ISO C90标准下的情况,(ISO 国际标准化组织)在该标准下,编译器会按照**int32_t, uint32_t, int64_t, uint64_t**的顺序来确定数据类型。其中它们表示的数值范围如下:
由上表可见,在编译“-2147483648 < 2147483657” 时,将-2147483648分成了两部分处理。
- 对于ISOC90标准,首先将2147483648 = 2[^31]看成无符号整型,其机器数为0x8000 0000,然后按位取反末位加1,仍为0x8000 0000, 还是将其看成一个无符号整型,值为2147483648