C指定大于数据类型范围的值

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

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

我想知道如果我指定大于int的值可以容纳,如何截断值或者确切地存储什么,如果我这样做会发生什么

int var = 2147483648;

 int var = 2147483648; 

有符号整数的实际行为是实现定义的 。 大多数情况下,该值将缩小(换句话说,“切割”)到四个最低有效字节(假设sizeof(int) = 4 )。

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

 int var = (int) 2147483648LL; 

转换后的实际值为-2147483648因为只设置了符号位(假设为二进制补码表示)。

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

否则,新类型将被签名,并且值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号。

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

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

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

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

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

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

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

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

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