C语言中有哪些类型

发布时间:2021-07-02 16:20:12 作者:Leah
来源:亿速云 阅读:192

这期内容当中小编将会给大家带来有关C语言中有哪些类型,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

C语言的数据类型

类型的位宽

相比于高级语言,C语言的整型数据类型都有固定位宽,即类型占多少位。比如下面的数据类型:

signed char
unsigned char
signed short
unsigned short
signed int
unsigned int
signed long
unsigned long
signed long long
unsigned long long

由于平台的不同,这些类型的位宽可能有些不相同,但是可以确定的是,每个平台都有固定的位宽。为了在编程过程中明确指定位宽,增加代码的可读性和避免对平台依赖,各个平台都定义了自己指定位宽的基本类型,如Linux平台上在stdint.h头文件就定义了如下类型

int8_t
uint8_t
int16_t
uint16_t
int32_t
uint32_t
int64_t
uint64_t

每个类型都指定了符号和位宽,从字面上就可以看到这个类型的位宽是多少。由于位宽的存在,导致每个类型都有自己的最大值和最小值,比如Linux又分别定义了每种类型的最大值和最小值(无符号数的最小值都是0)

INT8_MIN
INT8_MAX
INT16_MIN
INT16_MAX
INT32_MIN
INT32_MAX
INT64_MIN
INT64_MAX

UINT8_MAX
UINT16_MAX
UINT32_MAX
UINT64_MAX

有了这些定义,C语言的运算基本都要都要这些边界值,否则就会造成传说中的整数溢出问题。如加法和乘法运算就要做如下判断:

//计算两个值的和
uint32_t sum(uint32_t a, uint32_t b)
{
    /*先判断加法以后是否会溢出
    注意这里不能用 (a+b)<UINT32_MAX判断,因为a+b已经溢出了,判断已经没有意义了*/
    if ((UINT32_MAX - a) < b)
    {
        //error 
    }
    
    return a + b;
}

//计算两个值的乘积
uint32_t mul(uint32_t a, uint32_t b)
{
    /*先判断乘积以后是否会溢出
    注意这里不能用 (a*b)<UINT32_MAX判断,因为a*b已经溢出了,判断已经没有意义了*/
    if ((UINT32_MAX / a) < b)
    {
        //error
    }
    
    return a * b
}
类型的符号

C语言的整型数据类型都包含符号修饰符:signed (有符号)或者unsigned(无符号),但是符号修饰符并不影响数据真实的值,比如我们定义如下值:

signed char a = -1
unsigned char b = (signed char)a;

从内存的内容来讲,a的内存和b的内存是一致的,都是11111111,没什么区别,但是符号修饰符会影响逻辑判断的结果,比如虽然这两个值在内存上没什么区别,但是如果下比较会返回相反的结果:

signed char a = -1
unsigned char b = (signed char)a;

//成立
if (a < 0)
{
    printf("a < 0\n");
}

//成立
if (b > 0)
{
    printf("b > 0\n");
}

除了符号会影响逻辑判断之外,C语言的默认转换也会影响逻辑判断的结果,如下面的比较在不同的情况下,结果就不同

signed char a = -1
unsigned char b = (signed char)a;

//不成立,a没有转换为`unsigned char`
if (a > (unsigned char)0)
{
    printf("unsigned char a > 0\n");
}

//不成立,a没有转换为`unsigned short`
if (a > (unsigned short)0)
{
    printf("unsigned char a > 0\n");
}

//成立,a转换为`unsigned int`
if (a > (unsigned int)0)
{
    printf("unsigned int a > 0\n");
}

上述就是小编为大家分享的C语言中有哪些类型了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. C语言中有哪些类型说明符
  2. C语言中有哪些数据类型

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c语言

上一篇:PriorityQueue优先级队列是什么意思

下一篇:怎么创建一个C语言工程

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》