隐式类型转换 算术转换 操作符的属性

简介: 隐式类型转换 算术转换 操作符的属性

隐式类型转换

c的整形算术运算总是至少以缺省整型类型的精度来计算的

为了获得这个精度,变浓的是的字符和短整型的操作数在被使用前被转换为普通型,这中类型转化被称为整型提升

整形提升的意义:

表达式的整形运算实在cpu的相应的运算器内执行,cpu内整形运算的操作数的字节长度一般就是int长度的字节,同时也是cpu内整形操作数的标准长度

因此。即使两个字符类型相加,在cpu执行时实际也是先转化为cpu内整型操作数的标准长度。

通用cpu是难以直接实现两个8比特字节的直接相加运算。所以表达式各种长度小于int长度的整型值,都必须先转化为int或unsigned int才能进入cpu内运算。

如:char a, b, c;

.....

a = b+c;

这里的b和c先会被提升到普通整行时再参与计算。加运算结束后。结果将会被截断,然后再执行加法运算。

如何进行整型提升呢?

整型提升按照变量的数据类型的符号位来提升的。  高位补充符号位  无符号整型提升高位补零。

int main()
{
  char a = 3;
  //00000000000000000000000000000011
  //00000011--截断
  char b = 1237;
  //00000000000000000000000001111111
  //01111111--截断
  char c = a + b;
  //00000000000000000000000100000010
  //10000010--c 只取八位
  //整型提升
  printf("%d", c);
  //11111111111111111111111110000010
  //11111111111111111111111110000001
  //10000000000000000000000001111110
  //-126
  return 0;
}

一般会发生的整型提升的例子:

int main()
{
  //char 的范围-128~127
 //unsigned char
  char a = 0xb6;
  short b = 0xb600;
  int c = 0xb6000000;
  if (a == 0xb6)
    printf("a");
  if (b == 0xb600)
    printf("b");
  if (c == 0xb6000000)
    printf("c");
    //只有c打印,a与b都需要整形提升,提升之后值改变
  return 0;
}

整型提升,值发生了变化。

int main()
{
  char c = 1;
  char d = 2;
  printf("%u\n", sizeof(c));//1
  printf("%u\n", sizeof(+c));//4
  printf("%u\n", sizeof(-c));//4
  printf("%u\n", sizeof(c+d));//4
  //整形提升
  return 0;
}

我们可以根据数据类型来判断整型提升是存在的。

算术转换

如果某个操作数属于不同的类型,那麽除非其中一个操作数转为另一个操作数的类型,否则操作无法进行。寻常算术转换的层次体系:

long double

double

float;

unsigned long int

long int

unsigned int

int

如果一个数的类型在上面的列表很低,则它需要转化到另一个操作数的类型。

但是算数转化要合理。

float f = 3.14;
int num = f;//精度丢失

操作符的属性

复杂表达式求值有三个影响因素:

1.操作符的优先级

2.操作符的结核性

3.是否控制求值顺序

表达式的求值部分由操作符的优先级决定

操作符的优先级只能决定自减--的运算在+的运算的前面,但是我们没有办法的值,+操作符的左操作数的获取在右操作符之前还使之后求值,所以结果是不可预测的。

int fun()
{
  static int count = 1;
  return ++count;
}
int main()
{
  int answer;
  answer = fun() - fun() * fun();
  printf("%d\n", answer);//输出多少?
  return 0;
}

比如在这个函数调用,你如何去判断到底哪一个先去调用,这是不可预测的,值就不得而知。

相关文章
|
5月前
|
存储 编译器 C语言
【表达式求值】整型提升和算术转换
【表达式求值】整型提升和算术转换
46 0
|
2月前
运算符有哪些?优先级是怎么样的?转换数据类型的方法?(最少4种)
运算符有哪些?优先级是怎么样的?转换数据类型的方法?(最少4种)
16 0
|
5月前
|
编译器 测试技术 Go
表达式求值——隐式类型转换与操作符属性
表达式求值——隐式类型转换与操作符属性
|
5月前
|
存储 Java 程序员
强制类型转换运算符的深入解析
在编程中,类型转换是一个常见的操作,它允许我们将一个数据类型转换为另一个数据类型。在某些情况下,编译器可以自动执行这种转换,称为隐式类型转换。但在其他情况下,需要程序员显式地指定转换,这就是所谓的强制类型转换。
29 0
|
5月前
|
C#
C# 运算符详解:包含算术、赋值、比较、逻辑运算符及 Math 类应用
运算符用于对变量和值执行操作。在C#中,有多种运算符可用,包括算术运算符、关系运算符、逻辑运算符等。
71 1
|
11月前
|
Linux C语言 C++
操作符&算数转换题
操作符&算数转换题
61 0
|
测试技术
变量、数据类型和运算符
变量、数据类型和运算符
|
存储 编译器 C语言
【C语言】表达式求值相关问题汇总—>隐式类型转换(整型提升)、算数转换与操作符优先级汇总(收藏查阅)
【C语言】表达式求值相关问题汇总—>隐式类型转换(整型提升)、算数转换与操作符优先级汇总(收藏查阅)
93 0
|
C语言 索引
操作符续(整型提升与算术转换)
操作符续(整型提升与算术转换)
75 0
|
存储 Unix 编译器
表达式求值过程中会发生哪些隐藏的变化?求值顺序又由什么决定?——详解C表达式求值中的隐式类型转换,算术转换问题,以及操作符的属性
表达式求值过程中会发生哪些隐藏的变化?求值顺序又由什么决定?——详解C表达式求值中的隐式类型转换,算术转换问题,以及操作符的属性
146 0