Hallo zusammen,
Alle Jahre wieder: Man meint, so langsam C verstanden zu haben, und dann
bringt der Compiler eine Warnung, die ich nicht nachvollziehen kann:
1 | #define GLCD_KS0108_DISPWIDTH 64U
|
2 |
|
3 | // [....]
|
4 |
|
5 | void foo(void)
|
6 | {
|
7 | uint_fast16_t idx = 0U;
|
8 | idx += GLCD_KS0108_DISPWIDTH;
|
9 | }
|
und bekomme vom Compiler (MinGW 64) die Warnung:
1 | blblabla.c:18:31: warning: conversion to 'uint_fast16_t {a
|
2 | ka short unsigned int}' from 'unsigned int' may alter its value [-Wconversion]
|
3 | #define GLCD_KS0108_DISPWIDTH 64U
|
OK - der Compiler jammert herum, daß "64U" ein längerer Datentyp als
"unsigned short" ist. Da es keinen Modifier für "short" gibt, ändere ich
also:
1 | #define GLCD_KS0108_DISPWIDTH 64U
|
2 |
|
3 | // [....]
|
4 |
|
5 | void foo(void)
|
6 | {
|
7 | uint_fast16_t idx = 0U;
|
8 | idx += (uint_fast16_t) GLCD_KS0108_DISPWIDTH;
|
9 | }
|
Dann jammert der Compiler:
1 | blablabla.c:322:20: warning: conversion to 'uint_fast16_t {
|
2 | aka short unsigned int}' from 'int' may alter its value [-Wconversion]
|
3 | idx += (uint_fast16_t) GLCD_KS0108_DISPWIDTH;
|
Die "Integral Promotion"-Regel wandelt wohl meine "64U" in der Addition
in einen "int", damit der Compiler direkt nach der Summenbildung kurz
darauf jammern kann. Undgefähr wie das Kleinkind, das seine Rassel auf
den Boden wirft, um danach schreien zu können.
Wie bringe ich jetzt meinem Compiler bei, daß er ohne Angst zu einer
Zahl vom Datentyp "uint_fast16_t" einen Wert 64 addieren darf?
Viele Grüße
Nicolas