阅读这个问题的答案时,我看到了这条评论 [已编辑]。
2 的 0100(4) 的补码将是 1100。如果我正常地说,现在 1100 是 12。所以,
当我说正常的 1100 时它是 12,但是当我说 2 的补码 1100 时
它是-4?此外,在 Java 中,当存储 1100(现在假设为 4 位)时
如何确定它是+12还是-4? ——哈格拉瓦尔 7 月 2 日 16:53
在我看来,这个评论中提出的问题很有趣,所以我想首先重新表述它,然后提供一个答案和一个例子。
问题 – 系统如何确定必须如何解释一个或多个相邻字节?特别是,系统如何确定给定的字节序列是普通二进制数还是 2 的补码?
ANSWER – 系统确定如何通过类型解释字节序列。
类型定义
示例 - 下面我们假设
-
char 的长度为 1 个字节
-
short 的长度为 2 个字节
-
int 和 float 的长度为 4 个字节
请注意,这些尺寸特定于我的系统。虽然很常见,但它们可能因系统而异。如果您对它们在您的系统上的内容感到好奇,请使用sizeof operator。
首先我们定义一个包含4个字节的数组,并将它们全部初始化为二进制数10111101,对应十六进制数BD。
// BD(hexadecimal) = 10111101 (binary)
unsigned char l_Just4Bytes[ 4 ] = { 0xBD, 0xBD, 0xBD, 0xBD };
然后我们使用不同的类型读取数组内容。
unsigned char 和 signed char
// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );
// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char -> %i\n", *( ( signed char* )l_Just4Bytes ) );
unsigned short 和 short
// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );
// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short -> %hi\n", *( ( short* )l_Just4Bytes ) );
unsigned int、int 和 float
// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );
// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int -> %i\n", *( ( int* )l_Just4Bytes ) );
// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float -> %f\n", *( ( float* )l_Just4Bytes ) );
RAM 中的 4 个字节 (l_Just4Bytes[ 0..3 ]) 始终保持完全相同。唯一改变的是我们如何解释它们。
再次,我们告诉系统如何通过类型来解释它们。
例如,上面我们使用了以下类型来解释l_Just4Bytes数组的内容
-
unsigned char: 1 字节纯二进制
-
signed char:2 的补码中的 1 个字节
-
unsigned short: 2 个字节的普通二进制符号
-
short:2 的补码中的 2 个字节
-
unsigned int: 4 个字节的普通二进制符号
-
int:2 的补码中的 4 个字节
-
float:IEEE 754 单精度表示法中的 4 个字节
[编辑] 此帖已在 user4581301 发表评论后编辑。感谢您抽出宝贵的时间删除这几行有用的信息!