在 C int类型中可以有以下 + ve值范围2,147,483,647
源 :https://msdn.microsoft.com/en-IN/library/s3f49ktz.aspx
我想知道如果我指定大于int的值可以保存,如何截断值或者确切存储的是什么,如果我这样做
int var = 2147483648;
答案 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)
通常,如果在源代码中初始化类型(如示例中所示),则可能会收到编译器警告或错误。尽可能编译最高警告级别。
如果溢出是计算的结果,则它将是未定义的。实际上,这会导致环绕或截断,可能会出现溢出错误。