如果 16 位最大值为 65,535,为什么 int16 类型限制为 32,768?
Why is int16 type limit 32,768 if 16 bits max is 65,535?
所有“1”位的 16 位总和将得到 65,535:
第一个字节:
1(128) 1(64) 1(32) 1(16) 1(8) 1(4) 1(2) 1(1)
第二个字节:
1(327,68) 1(16,384) 1(8,192) 1(4,096) 1(2,048) 1(1,024) 1(512) 1(256)
小数点是:
32,768 + 16,384 + 8,192 + 4,096 + 2,048 + 1,024 + 512 + 256 + 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1
总数为:65,535
int16 的最大值应该是 65,535 和 32,768(也就是 1000 0000 0000 0000)
我看不出不然会怎样。
因为它的范围是从-32,768到32,767,总共是65,536(这里包括0)可能的值。
如果你使用UInt16
(代表unsigned int16)你可以给它一个值65,535。
这就是signed int和unsigned int的区别。 [0, 65535] 中的 16 位无符号整数范围。而 16 位有符号整数范围 [-32768, 32767]。 int16 的最大值应该是 32767 而不是 32768.
您忘记了标志。 int16 是有符号类型,所以它实际上是:
第一个字节:...
第二个字节:符号(+ 或 -)1(16,384) ...
涵盖 -32768 到 32767 的范围(0 被视为正数)。
大多数情况下,0 用于正值,1 用于负值:Sign bit
如果它是 uint16(u 表示无符号),那就完全不同了:
第一个字节:...
第二个字节:1(32768) ...
反过来,范围从 0 到 65535。
Int16 已签名。最高有效位表示符号(0 表示正数,1 表示负数)。以 0 作为 MSB 可实现的最大数字是 0111 1111 1111 1111,十进制为 32767。
它是这样设计的,所以 unsigned addition/subtraction 也适用于有符号数。因此,要获得 -1,您需要从 0 中减去 1,并得到 1111 1111 1111 1111(由于溢出)。如果继续减法,最终会达到 1000 0000 0000 0000 = -32768 (dec),这是可以表示为 int16 的最小负数。
因此,2^16 = 65536,这是可表示值的总数。加起来是:(a) 1 个零值,(b) 32767 个正数,(c) 32768 个负数。
有符号整数和无符号整数是有区别的。
一个有负的能力,一个没有。
它不仅适用于 int16,也适用于其他类型。
+--------+----------------------------+----------------------------+--------------------------+
| Type | Min | Max | Size |
+--------+----------------------------+----------------------------+--------------------------+
| sbyte | -128 | 127 | Signed 8-bit integer |
| byte | 0 | 255 | Unsigned 8-bit integer |
| char | U+0000 | U+ffff | Unicode 16-bit character |
| short | -32,768 | 32,767 | Signed 16-bit integer |
| ushort | 0 | 65,535 | Unsigned 16-bit integer |
| int | -2,147,483,648 | 2,147,483,647 | Signed 32-bit integer |
| uint | 0 | 4,294,967,295 | Unsigned 32-bit integer |
| long | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | Signed 64-bit integer |
| ulong | 0 | 18,446,744,073,709,551,615 | Unsigned 64-bit integer |
+--------+----------------------------+----------------------------+--------------------------+
所有“1”位的 16 位总和将得到 65,535:
第一个字节: 1(128) 1(64) 1(32) 1(16) 1(8) 1(4) 1(2) 1(1)
第二个字节: 1(327,68) 1(16,384) 1(8,192) 1(4,096) 1(2,048) 1(1,024) 1(512) 1(256)
小数点是:
32,768 + 16,384 + 8,192 + 4,096 + 2,048 + 1,024 + 512 + 256 + 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1
总数为:65,535
int16 的最大值应该是 65,535 和 32,768(也就是 1000 0000 0000 0000)
我看不出不然会怎样。
因为它的范围是从-32,768到32,767,总共是65,536(这里包括0)可能的值。
如果你使用UInt16
(代表unsigned int16)你可以给它一个值65,535。
这就是signed int和unsigned int的区别。 [0, 65535] 中的 16 位无符号整数范围。而 16 位有符号整数范围 [-32768, 32767]。 int16 的最大值应该是 32767 而不是 32768.
您忘记了标志。 int16 是有符号类型,所以它实际上是:
第一个字节:...
第二个字节:符号(+ 或 -)1(16,384) ...
涵盖 -32768 到 32767 的范围(0 被视为正数)。
大多数情况下,0 用于正值,1 用于负值:Sign bit
如果它是 uint16(u 表示无符号),那就完全不同了:
第一个字节:...
第二个字节:1(32768) ...
反过来,范围从 0 到 65535。
Int16 已签名。最高有效位表示符号(0 表示正数,1 表示负数)。以 0 作为 MSB 可实现的最大数字是 0111 1111 1111 1111,十进制为 32767。
它是这样设计的,所以 unsigned addition/subtraction 也适用于有符号数。因此,要获得 -1,您需要从 0 中减去 1,并得到 1111 1111 1111 1111(由于溢出)。如果继续减法,最终会达到 1000 0000 0000 0000 = -32768 (dec),这是可以表示为 int16 的最小负数。
因此,2^16 = 65536,这是可表示值的总数。加起来是:(a) 1 个零值,(b) 32767 个正数,(c) 32768 个负数。
有符号整数和无符号整数是有区别的。 一个有负的能力,一个没有。
它不仅适用于 int16,也适用于其他类型。
+--------+----------------------------+----------------------------+--------------------------+
| Type | Min | Max | Size |
+--------+----------------------------+----------------------------+--------------------------+
| sbyte | -128 | 127 | Signed 8-bit integer |
| byte | 0 | 255 | Unsigned 8-bit integer |
| char | U+0000 | U+ffff | Unicode 16-bit character |
| short | -32,768 | 32,767 | Signed 16-bit integer |
| ushort | 0 | 65,535 | Unsigned 16-bit integer |
| int | -2,147,483,648 | 2,147,483,647 | Signed 32-bit integer |
| uint | 0 | 4,294,967,295 | Unsigned 32-bit integer |
| long | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | Signed 64-bit integer |
| ulong | 0 | 18,446,744,073,709,551,615 | Unsigned 64-bit integer |
+--------+----------------------------+----------------------------+--------------------------+