C分配的值大于数据类型范围

时间:2015-07-10 18:07:53

标签: c int range

C int类型中可以有以下 + ve值范围2,147,483,647

https://msdn.microsoft.com/en-IN/library/s3f49ktz.aspx

我想知道如果我指定大于int的值可以保存,如何截断值或者确切存储的是什么,如果我这样做

int var = 2147483648;

4 个答案:

答案 0 :(得分:1)

int var = 2147483648;

有符号整数的实际行为是实现定义。最有可能的是,这个值会缩小(换句话说是“cut-of”)到四个最低有效字节(假设sizeof(int) = 4)。

常量2147483648可能属于long类型(如果前者不足以容纳它,则为long long),所以这里实际发生的是:

int var = (int) 2147483648LL;

转换后的实际值为-2147483648,因为只设置了符号位(假设有两个补码表示)。

引自C11(N1570)§6.3.1.3/ p3 有符号和无符号整数(强调我的):

  

否则,新类型已签名且无法表示该值   在里面;结果是实现定义或者   实现定义的信号被提出。

例如,对于GCC,结果是减少结果模2^N,这实际上与字节“切断”相同:

  

对于转换为宽度N的类型,该值以2 ^ N为模减少   在该类型的范围内;没有信号被提出。

答案 1 :(得分:1)

正如您所引用的链接语句,错误。但是,链接页面声明正确它对该特定实现有效。阅读标准类型的最小范围standard

实际尺寸在limits.h。你不应该依赖任何其他东西。如果您需要特定尺寸,请使用stdint.h类型。

如果将签名值分配给无法保存该值的对象,则结果为implementation defined。 适当的编译器允许对此类问题启用警告 - 使用它们!

OTOH,对于无符号值,它定义非常明确(标准的相同部分)。简单地说,高位只是被忽略了。

答案 2 :(得分:0)

在C中,没有检查溢出。结果是实现定义

答案 3 :(得分:0)

通常,如果在源代码中初始化类型(如示例中所示),则可能会收到编译器警告或错误。尽可能编译最高警告级别。

如果溢出是计算的结果,则它将是未定义的。实际上,这会导致环绕或截断,可能会出现溢出错误。