C语言中数据类型的二进制表示

C语言中数据类型的二进制表示,c,binary,integer,twos-complement,C,Binary,Integer,Twos Complement,如果我在C中有一个正常的32位整数,那么这个数字在内存中是如何表示的?具体来说,该标志是如何存储的 起初我认为它是符号和大小,但后来我记得会有+和-0,所以我认为它可以存储在2的补码中,但是当使用2的补码时,我得到的最大值是4294967293,MSB设置为0(我通过将从2^31到2^0的所有值相加得到这个值)我们都知道这是错误的 C标准并不要求二者互补,但它是迄今为止最常见的选择(我认为即使是这样也有点轻描淡写)。你得到一个40亿左右的值,而不是正确的INT\u MAX,原因是一个错一个错:你

如果我在C中有一个正常的32位整数,那么这个数字在内存中是如何表示的?具体来说,该标志是如何存储的


起初我认为它是符号和大小,但后来我记得会有+和-0,所以我认为它可以存储在2的补码中,但是当使用2的补码时,我得到的最大值是4294967293,MSB设置为0(我通过将从2^31到2^0的所有值相加得到这个值)我们都知道这是错误的

C标准并不要求二者互补,但它是迄今为止最常见的选择(我认为即使是这样也有点轻描淡写)。你得到一个40亿左右的值,而不是正确的
INT\u MAX
,原因是一个错一个错:你还添加了第32位。231是MSB的值(因为LSB的值为20),因此正确的值为和20+…+230=231-1。

C标准并不要求两个标准的补充,但它是目前为止最常见的选择(我认为即使是这样也有点轻描淡写)。你得到一个40亿左右的值,而不是正确的
INT\u MAX
,原因是一个错一个错:你还添加了第32位。231是MSB的值(因为LSB的值为20),因此正确的值为和20+…+230=231-1。

C标准并不要求两个标准的补充,但它是目前为止最常见的选择(我认为即使是这样也有点轻描淡写)。你得到一个40亿左右的值,而不是正确的
INT\u MAX
,原因是一个错一个错:你还添加了第32位。231是MSB的值(因为LSB的值为20),因此正确的值为和20+…+230=231-1。

C标准并不要求两个标准的补充,但它是目前为止最常见的选择(我认为即使是这样也有点轻描淡写)。你得到一个40亿左右的值,而不是正确的
INT\u MAX
,原因是一个错一个错:你还添加了第32位。231是MSB的值(因为LSB的值为20),因此正确的值为和20+…+230=231-1。

即使这是实现定义的,大多数机器也使用二的补码


问题是你的计算错了。将2^0和2^31相加(顺便说一下,这是2^32-1)意味着使用32位。这是不正确的:只有31位用于实际数字。MSB有一个特殊的含义,它与符号有关(实际上不是“符号”)。因此,您需要从2^0到2^30(即2^31-1)求和。

即使这是实现定义的,大多数机器也使用2的补码


问题是你的计算错了。将2^0和2^31相加(顺便说一下,这是2^32-1)意味着使用32位。这是不正确的:只有31位用于实际数字。MSB有一个特殊的含义,它与符号有关(实际上不是“符号”)。因此,您需要从2^0到2^30(即2^31-1)求和。

即使这是实现定义的,大多数机器也使用2的补码


问题是你的计算错了。将2^0和2^31相加(顺便说一下,这是2^32-1)意味着使用32位。这是不正确的:只有31位用于实际数字。MSB有一个特殊的含义,它与符号有关(实际上不是“符号”)。因此,您需要从2^0到2^30(即2^31-1)求和。

即使这是实现定义的,大多数机器也使用2的补码


问题是你的计算错了。将2^0和2^31相加(顺便说一下,这是2^32-1)意味着使用32位。这是不正确的:只有31位用于实际数字。MSB有一个特殊的含义,它与符号有关(实际上不是“符号”)。因此,您需要从2^0总结到2^30(即2^31-1)。

这实际上是实现定义的。但是现在2的补码可能是使用最广泛的。你可能想了解一下不在符号表示法中的符号(既不是2的补码,也不是符号大小)。最大的无符号32位整数确实是
2^32-1
,但那是完全不同的事情。@delnan oop,是的,很抱歉我错了一位。我应该说
31^1-1
(2^0+…+2^30的总和)。这实际上是实现定义的。但是现在使用最广泛的可能是二的补码。您可能想了解一下。@mbrach不在符号表示中(既不是二的补码,也不是符号大小)。最大的无符号32位整数确实是
2^32-1
,但这是一个完全不同的问题。@delnan oop,是的,很抱歉我错了一位。我应该说
31^1-1
(总和
2^0+…+2^30
。这实际上是实现定义的。但是现在使用最广泛的可能是二的补码。您可能想了解一下。@mbrach不在有符号表示中(既不是二的补码,也不是符号大小)。最大的无符号32位整数确实是
2^32-1
,但这是一个完全不同的问题。@delnan oop,是的,很抱歉我错了一位。我应该说
31^1-1
(总和
2^0+…+2^30
。这实际上是实现定义的。但是现在使用最广泛的可能是二的补码。您可能想了解一下。@mbrach不在有符号表示中(既不是二的补码,也不是符号大小)。最大的无符号32位整数确实是
2^32-1
,但这是一个完全不同的问题。@delnan oop,是的,很抱歉我错了一位。我应该说
31^1-1
2^0+…+2^30
之和)。