...
Typically, converting an integer to a smaller type results in truncation of the high-order btis.
Non-Compliant Code Example
Type range errors, including loss of data (truncation) and loss of sign (sign errors), can occur when converting from an unsigned type to a signed type. The following code is likely to result in a truncation error for almost all implementations:
Code Block |
---|
unsigned long int ul = ULONG_MAX;
signed char sc;
sc = (signed char)ul; /* cast eliminates warning */
|
Compliant Solution
Validate ranges when converting from an unsigned type to a signed type. The following code, for example, can be used when converting from unsigned long int
to a signed char
.
...
Include Page |
---|
| c:INT31 NCCE2 |
---|
| c:INT31 NCCE2 |
---|
|
Include Page |
---|
| c:INT31 NCCE3 |
---|
| c:INT31 NCCE3 |
---|
|
Include Page |
---|
| c:INT31 NCCE4 |
---|
| c:INT31 NCCE4 |
---|
|
Non-Compliant Code Example
Type range errors, including loss of data (truncation) and loss of sign (sign errors), can occur when converting from a signed type to an unsigned type. The following code results in a loss of sign:
Code Block |
---|
signed int si = INT_MIN;
unsigned int ui;
si = (unsigned int)ui; /* cast eliminates warning */
|
Compliant Solution
Validate ranges when converting from a signed type to an unsigned type. The following code, for example, can be used when converting from signed int
to unsigned int
.
...
NOTE: While unsigned types can usually represent all positive values of the corresponding signed type, this relationship is not guaranteed by the C99 standard.
Non-Compliant Code Example
A loss of data (truncation) can occur when converting from a signed type to a signed type with less precision. The following code is likely to result in a truncation error for most implementations:
Code Block |
---|
signed long int sl = LONG_MAX;
signed char sc;
sc = (signed char)sl; /* cast eliminates warning */
|
Compliant Solution
Validate ranges when converting from an unsigned type to a signed type. The following code can be used, for example, to convert from a signed long int
to a signed char
:
...
Conversions from signed types with greater precision to signed types with lesser precision require both the upper and lower bounds to be checked.
Non-Compliant Code Example
A loss of data (truncation) can occur when converting from an unsigned type to an unsigned type with less precision. The following code is likely to result in a truncation error for most implementations:
Code Block |
---|
unsigned long int ul = ULONG_MAX;
unsigned char uc;
uc = (unsigned char)ul; /* cast eliminates warning */
|
Compliant Solution
Validate ranges when converting from an unsigned type to a signed type. The following code can be used, for example, to convert from an unsigned long int
to an unsigned char
:
...