在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中,没有检查溢出。 结果是实现定义 。
以上就是c/c++开发分享C指定大于数据类型范围的值相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/519263.html