整体推广

Fra*_*lea 5 c integer-promotion

什么时候有符号整数不能代表整数提升的原始类型的所有值?

来自K&R,C Programming Language,2nd Ed.页.174

A.6.1整体推广

无论是否有符号,都可以使用字符,短整数或整数位字段,或者枚举类型的对象,可以在任何可以使用整数的表达式中使用.如果int可以表示原始类型的所有值,则该值将转换为int; 否则该值将转换为unsigned int.这个过程称为整体推广.

此代码显示了我的系统类型的限制:

#include <stdio.h>
#include <limits.h>

int main(void)
{

    printf("CHAR_MAX: %i\n", CHAR_MAX);     
    printf("UCHAR_MAX: %i\n", UCHAR_MAX);

    printf("SHORT_MAX: %i\n", SHRT_MAX);        
    printf("USHORT_MAX: %i\n", USHRT_MAX);

    printf("INT_MAX: %i\n", INT_MAX);       
    printf("UINT_MAX: %u\n", UINT_MAX);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果是:

CHAR_MAX: 127
UCHAR_MAX: 255
SHORT_MAX: 32767
USHORT_MAX: 65535
INT_MAX: 2147483647
UINT_MAX: 4294967295
Run Code Online (Sandbox Code Playgroud)

signed int类型比任何其他类型都大,所以什么时候会回到UINT_MAX?

Ry-*_*Ry- 5

例如,a可能与a short int的大小相同int,因此unsigned short int无法将其提升为a int.这不是你的编译器的情况.