【发布时间】:2017-09-12 08:52:45
【问题描述】:
我有一个复杂的定点算术程序。
似乎偶尔会出现溢出。
为了找到它们,我设置了标志-ftrapv。这似乎只适用于int32_t。那是对的吗?
有没有办法用int16_t 和int8_t 实现相同的行为?
这是我的测试代码:
#include <stdio.h>
#include <stdint.h>
int main(void)
{
int8_t int8 = 127;
int8 += 1;
printf("int8: %d\n",int8);
int16_t int16 = 32767;
int16 += 1;
printf("int16: %d\n",int16);
int32_t int32 = 2147483647;
int32 += 1;
printf("int32: %d\n",int32);
}
我编译:
rm a.out; gcc -ftrapv main.c && ./a.out
然后得到:
int8: -128
int16: -32768
Aborted
我的编译器版本是gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609。
注意:有些答案是指我之前写错的一个测试程序。
【问题讨论】:
-
我不认为你的结果是正确的,因为小于 int 的类型总是会被提升为 int,所以那些 int8 和 int16 的操作不会溢出
-
@Lưu Vĩnh Phúc:是的,另见 Lundin 的回答
-
投票结束,因为问题已经改变,现在发布的答案无效。