Appendix D.7 for "+" states in paragraph 2.1 that

Quote:if both operands are essentially unsigned, then if the expression is an integer constant expression then the essential type of the result is the UTLR of the result.

Casts from arithmetic types to integer types are permitted in integer constant expressions and so the expression satisfies the conditions of 2.1. Therefore the essential type of the result will be "unsigned char".

The MISRA Essential Types model produces an internally consistent view of C types, but a side-effect of keeping the model simple has been that a few integer constant expressions (where integer promotions are involved) may produce results that at first sight are not obvious.

For those interested in the detailed calculation of the Essential Type for an expression, there are two basic situations that are useful to remember.

- 1. Is it an operator whose operands might undergo an "integer promotion" to unsigned int or signed int.

- 2. Would the operation have taken place in unsigned int or signed int?

This second situation is particularly important since Appendix D.1 states that

Quote: The essential type of an expression only differs from the standard C type in expressions where the standard type is either signed int or unsigned int.

The following examples aim to clarify the application of the essential type rules to expressions containing either casts or literals with suffices.

unsigned int u1, u2; // assuming 16 bit short and 32 bit int

Code:

`5U; : Essential Type (ET) = unsigned char`

See Appendix D.6

Code:

`(unsigned short)5U; : ET = unsigned short`

The ET which results from a cast is the same as the "standard type"(ST), which in this case is unsigned short.

The standard type is "unsigned short", and so according to Appendix D.1, the essential type is the same as the standard type. (Appendix D.7 is not applied)

Code:

`(unsigned int)5U; : ET = unsigned int`

The standard type is "unsigned int", which means according to Appendix D.1 that the other sections in Appendix D need to be considered. Appendix D.7 states

Quote:The essential type of any expression not listed in this section is the same as its standard type

Casts are not mentioned in Appendix D.7, and so the essential type is the same as the standard type.

Code:

`2U + 3U; : ET = unsigned char`

The standard type for the result of the "+" operation is "unsigned int", which means Appendix D.7 on "+" is applicable.

The ET is determined by Appendix D.7 on "+" 2.1.

Quote: If the expression is an integer constant expression then the essential type of the result is the UTLR of the result.

The unsigned type of lowest rank (UTLR) for the value 5 is unsigned char.

Code:

`(unsigned short)(2U + 3U); : ET = unsigned short`

The ET is the result of a cast and is therefore the same as the standard type.

Code:

`(unsigned short)2U + (unsigned short)3U; : ET = unsigned char`

The standard type for the result of the "+" operation is "signed int", which means Appendix D.7 on "+" is applicable.

The ET is determined by Appendix D.7 on "+" 2.1, The UTLR for the value 5 is unsigned char.

Code:

`(unsigned long)2U+(unsigned long)3U; : ET = unsigned long`

The standard type is "unsigned long", so the ET is the same as the standard type. (Appendix D.7 is not applied)

Code:

`2UL + 3UL; : ET = unsigned long`

The standard type is "unsigned long", so the ET is the same as the standard type. (Appendix D.7 is not applied)

Code:

`(unsigned short)u1 + (unsigned short)u2; : ET = unsigned short`

The standard type for the result of the "+" operation is "signed int", which means Appendix D.7 on "+" is applicable.

The ET is determined by Appendix D.7 on "+" 2.2, which states that

Quote:the essential type of the result is the essential type of the operand with the highest rank.

In this case both operands have an ET of unsigned short.

Code:

`(unsigned short)50000U + (unsigned short)50000U; : ET = unsigned int`

The standard type for the result of the "+" operation is "signed int", which means Appendix D7 on "+" is applicable.

The ET is determined by Appendix D.7 on "+" 2.1, The UTLR for the value 100,000 is unsigned int.