c - Fixpoint-Overflow-Traps for int16_t and int8_t -
i have complicated program fixed-point arithmetic.
it seems there occasional overflows.
to find them have set flag -ftrapv. seems work int32_t. correct?
is there way achieve same behavior int16_t , int8_t?
here test code:
#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); } i compile with:
rm a.out; gcc -ftrapv main.c && ./a.out and get:
int8: -128 int16: -32768 aborted my compiler version gcc (ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609.
note: of answers refer test program have incorrectly written before.
i have no idea trying do.
- the maximum value
int8_tcan hold 127 , not 255. - the maximum value
int16_t32767 , not 65535. - the maximum value
int32_tcan hold indeed 2147483647.
so code does:
int8_t int8 = 255;assign value 255 variable can hold maximum of 127. won't fit, invoke implicit conversion in implementation-defined manner. end value -1. implicit lvalue conversion , no signed integer overflow.printf("int8: %d\n",int8 + 1);print result of-1 + 1.0. no overflow anywhere.the same thing happens 16 bit variable, implicit conversion, end value -1, print 0.
int32_t int32 = 2147483647;line different other two, set int32 maximum value can contain. if take+1on that, signed integer overflow invokes undefined behavior.
on top of that, 2 smaller integer types can't overflow upon addition, if code doing (which doesn't). both operands integer promoted type int - there no overflow. see implicit type promotion rules detailed explanation how works.
Comments
Post a Comment