在我的系统中,int数据类型的大小是4个字节,因此它可以具有的最大无符号int值是4294967296。
# include<stdio.h> int main(void) { unsigned int a = 4294967296; return 0; }
为什么我的编译器抛出一个错误,即使它可以容纳的最大值是4294967296?警告是“隐式常量转换中溢出”谢谢!
c86crjj01#
你不需要记住这些常数或自己计算它们。最大的int值在文件limits.h中定义。该文件还定义了最大的short,unsigned int等,以及每个整数数据类型的最小值:
int
limits.h
short
unsigned int
#include <limits.h> ... int a = INT_MAX; short b = SHRT_MAX; unsigned int c = UINT_MAX;
6l7fqoea2#
int是一个有符号的值,所以它也会变成负数,这实际上是正数域中的一半。这个警告告诉你它将溢出为负数。
lawou6xi3#
2,147,483,647应该是正确的值。
apeeds0o4#
4294967296
a
INT_MAX
2147483647
UINT_MAX + 1
所以当你这么做的时候
int a = 4294967296; /* it can hold max 2147483647 on 32-bit, more than this cause overflow */
它将溢出为负数(INT_MIN到INT_MAX),并且有符号整数溢出的行为在C标准中是undefined。
INT_MIN
byqmnocz5#
您的编译器通过通知您溢出是绝对正确的。为了使它更简单一点,想象一个4位整数。一个四位整数最多可以保存2^4=16个不同的值。每个值只能是这四位的组合:
8 4 2 1 0 0 0 0 = 0*8 + 0*4 + 0*2 + 0*1 = 0 0 0 0 1 = 0*8 + 0*4 + 0*2 + 1*1 = 1 0 0 1 0 = 0*8 + 0*4 + 1*2 + 0*1 = 2 ... 1 1 0 0 = 1*8 + 1*4 + 0*2 + 0*1 = 12 1 1 0 1 = 1*8 + 1*4 + 0*2 + 1*1 = 13 1 1 1 0 = 1*8 + 1*4 + 1*2 + 0*1 = 14 1 1 1 1 = 1*8 + 1*4 + 1*2 + 1*1 = 15
因此,一个四位整数可以有16个不同的值,但最大的值是15(= 16 - 1 = 2^4 - 1)。回到由32位组成的四字节整数。和以前一样的游戏:32位可以以2^32 = 4294967296种不同的方式组合。32位可以写入的最大数字是2^32 - 1 = 4294967295。要写入值为4294967296的二进制数,您需要额外的第33位。因为你的整数只有32位长,编译器会通知你这一点。
7bsow1i66#
你计算得刚刚好!但你忘了考虑到负数也是可以存在的例如,假设你有5个数字,1到5算作5个数字,-4到4也算作5个数字。你提到的数字(以及其他答案中的数字)可以存储在unsigned int中,字面意思是“没有符号”,而signed int可以保存相同数量的数字,但在负方向和正方向上相等,总计为你计算的数字。如果我的回答没有帮助,那么maybe this should.希望能帮上忙!
signed int
6条答案
按热度按时间c86crjj01#
你不需要记住这些常数或自己计算它们。最大的
int
值在文件limits.h
中定义。该文件还定义了最大的short
,unsigned int
等,以及每个整数数据类型的最小值:6l7fqoea2#
int
是一个有符号的值,所以它也会变成负数,这实际上是正数域中的一半。这个警告告诉你它将溢出为负数。lawou6xi3#
2,147,483,647应该是正确的值。
apeeds0o4#
4294967296
?* 不可以**,因为您的情况下默认的是a
,所以不能。INT_MAX
是2147483647
而不是4294967296
(它是UINT_MAX + 1
)所以当你这么做的时候
它将溢出为负数(
INT_MIN
到INT_MAX
),并且有符号整数溢出的行为在C标准中是undefined。byqmnocz5#
您的编译器通过通知您溢出是绝对正确的。
为了使它更简单一点,想象一个4位整数。一个四位整数最多可以保存2^4=16个不同的值。每个值只能是这四位的组合:
因此,一个四位整数可以有16个不同的值,但最大的值是15(= 16 - 1 = 2^4 - 1)。
回到由32位组成的四字节整数。和以前一样的游戏:32位可以以2^32 = 4294967296种不同的方式组合。32位可以写入的最大数字是2^32 - 1 = 4294967295。
要写入值为4294967296的二进制数,您需要额外的第33位。因为你的整数只有32位长,编译器会通知你这一点。
7bsow1i66#
你计算得刚刚好!但你忘了考虑到负数也是可以存在的例如,假设你有5个数字,1到5算作5个数字,-4到4也算作5个数字。你提到的数字(以及其他答案中的数字)可以存储在
unsigned int
中,字面意思是“没有符号”,而signed int
可以保存相同数量的数字,但在负方向和正方向上相等,总计为你计算的数字。如果我的回答没有帮助,那么maybe this should.希望能帮上忙!