char&short的整形提升

简介: char&short的整形提升

前言


       前面我们介绍了有关C语言中操作符的有关知识,当然操作符的作用就是要求相关表达式的值,当不同的数据类型相加减的时候,我们要进行一定的数据类型的转变。要怎么变化呢?经过之前各种大佬们想到了一种办法那就是表达式的整形提升。各位坐稳扶好,我们要开车了!!!


整形提升的意义


       表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。


例如


char a, b, c;
{代码块}
a = b + c;


       上面这个代码执行的过程是:b和c的值被提升为普通整型,然后再执行加法运算,加法运算完成之后,结果将被截断,然后再存储于a中。


整形提升的步骤


       整形提升是按照变量的数据类型的符号位来提升的


负数的整形提升


       负数整形提升的时候,高位补充符号位,即为1

例如char c1 = -1;

变量c1的二进制位(补码)中只有8个比特位:

1111111

因为 char 为有符号的 char

所以整形提升的时候,高位补充符号位,即为1

提升之后的结果是:

11111111111111111111111111111111


正数的整形提升


正数整形提升的时候,高位补充符号位,即为0

char c2 = 1;

变量c2的二进制位(补码)中只有8个比特位:

00000001

因为 char 为有符号的 char

所以整形提升的时候,高位补充符号位,即为0

提升之后的结果是:

00000000000000000000000000000001



无符号整形提升


无符号整形提升,高位补0


整形提升的例子


int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}

       该例子中的,c只要参与表达式运算,就会发生整形提升


       表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节.

       表达式 -c 也会发生整形提升,所以 sizeof(-c) 是4个字节


       但是 sizeof(c) ,就是1个字节.


目录
相关文章
|
存储 关系型数据库 MySQL
面试时被这样一个问:”存储MD5值应该用VARCHAR还是用CHAR?
一个5年工作经验的小伙伴,在面试的时候被这样一个问题。说”存储MD5值应该用VARCHAR还是用CHAR“,他一时间不只如何选择,感觉用VARCHAR也可以,用CHAR也行。希望我来帮忙分析一下。
103 0
|
20天前
|
存储 数据管理 数据库
|
4月前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
4月前
|
存储 数据库
5. CHAR和VARCHAR的区别?
`CHAR`和`VARCHAR`在数据库中有所不同:`CHAR`长度固定,用空格填充,存储效率高,英文占1字节,汉字占2字节;而`VARCHAR`长度可变,节省空间,英文和汉字都占2字节。
48 0
|
4月前
|
存储 SQL NoSQL
面试题:char和varchar的区别?
字节面试题:char和varchar的区别?
81 0
|
4月前
|
存储 机器学习/深度学习 关系型数据库
mysql中char和varchar的区别
mysql中char和varchar的区别
89 1
|
12月前
|
存储 SQL 数据库
char、varchar、nvarchar、text的区别
char、varchar、nvarchar、text的区别
63 0
|
4月前
|
存储 关系型数据库 MySQL
MySQL之varchar和char的区别
MySQL之varchar和char的区别
44 0