C语言中哪些基本数据类型在类型提升机制下会发生怎样的转换?
摘要:本文介绍了 C 语言中的基本数据类型体系,包括整数类型、浮点类型以及字符类型,并对各类型的常见取值范围和使用特点进行了说明。在此基础上,进一步解释了 C 语言表达式计算中常见的类型提升机制,重点说明了 `char` 与 `short` 在运
一、基本整数类型
整数类型用于表示不带小数部分的数值。C语言是通过长度和符号两个维度来扩展整数类型。但是需要注意 C 标准只规定了最小位数,不规定具体大小,具体实现则由编译器和平台决定。下面按照常规情况说明整数类型:
类型常见大小
char
8 bit
short
16 bit
int
32 bit
long
32 bit
long long
64 bit
(一)、有符号短整型(short)
short 是signed short的简写,其位宽至少有16位,常见的 short 范围是 -32768~32767,计算公式是 -2n-1 ~ 2n-1。
short a;
signed short b;
short int c;
但是这里要注意不要假设位宽一定是16位,只能假设 ≥16位。同时short在参与表达式计算时会发生整数提升,通常是被提升为 int。
(二)、无符号短整型(unsigned short)
unsigned short 是 short 的无符号版本,只能表示非负整数,其位宽与short相同,常见的范围是 0~65535,计算公式是 0 ~ (2n-1)。
unsigned short a;
unsigned short int b;
(三)、有符号整型(signed int)
int 是 signed int 的简写,C标准规定 int位宽 ≥ short位宽 ,在大多数32位系统中 int 位宽是 32bit,常见范围是-2147483648 ~ 2147483647。
int a;
signed int b;
int 是C语言最常使用的整数类型。
(四)、无符号整型(unsigned int)
unsigned int 是 int 的无符号版本,只能表示非负整数,其位宽与 int 相同,常见范围是0 ~ 4294967295。
unsigned int a;
(五)、有符号长整型(long)
long 是 signed long int 的简写,C标准规定 long位宽 ≥ int 位宽,但在大多数32位系统中,long位宽是32bit,常见范围是-2147483648 ~ 2147483647。
long a;
signed long b;
long int c;
(六)、无符号长整型( unsigned long)
unsigned long 是 long 的无符号版本,只能表示非负整数,其位宽与 long 相同,常见范围是0 ~ 4294967295。
unsigned long a;
(七)、有符号长长整型( long long)
long long 是 signed long long 的简写,其位宽是 64bit,常见的范围是-263 ~ 263 -1,也就是-9223372036854775808~9223372036854775807。
long long a;
signed long long b;
(八)、无符号长长整型(unsigned long long)
unsigned long long 是 long long 的无符号版本,只能表示非负整数,其位宽与 long long 相同,常见范围是0 ~ 264 - 1,也就是0 ~ 18446744073709551615。
unsigned long long a;
(九)、字符整型(char)
char 在C语言中也是整数类型,并不是专门的“字符类型”。设计 char 的初衷是用于存储一个字节的数据,因此既可以表示字符,也可以表示小范围的整数。按照C标准规定 char = 1 byte ,通常在绝大多数系统中其位宽是 8bit。标准允许 byte ≥ 8bit,但是该情况仅为标准兼容设计,现实中所有主流平台(PC、嵌入式、MCU)的 1byte 均为 8bit。
signed char 的常见范围是 -128 ~ 127,unsigned char 的常见范围是 0 ~ 255,而 char 由编译器决定。
char a;
signed char b;
unsigned char c;
需要注意 char 是否带符号由编译器决定。比如在Keil ARMCC中 char 默认类型是 unsigned char ,但是在GCC中 char 默认类型是 signed char。
二、浮点数
浮点数用于表示带小数的数值。
