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

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

隐式类型转换

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;
}

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

相关文章
|
7月前
|
存储 编译器 C语言
【表达式求值】整型提升和算术转换
【表达式求值】整型提升和算术转换
56 0
|
7月前
|
存储
算术表达式的转换
算术表达式的转换
|
4月前
|
存储 Java
02 Java基础语法(变量+数据类型+运算符)(上)
02 Java基础语法(变量+数据类型+运算符)
50 4
|
7月前
|
编译器 测试技术 Go
表达式求值——隐式类型转换与操作符属性
表达式求值——隐式类型转换与操作符属性
|
7月前
|
C#
C# 运算符详解:包含算术、赋值、比较、逻辑运算符及 Math 类应用
运算符用于对变量和值执行操作。在C#中,有多种运算符可用,包括算术运算符、关系运算符、逻辑运算符等。
87 1
|
Linux C语言 C++
操作符&算数转换题
操作符&算数转换题
71 0
|
测试技术
变量、数据类型和运算符
变量、数据类型和运算符
|
编译器 C语言 C++
学C的第十六天【操作符详解:9. 条件操作符;10. 逗号表达式;11. 下标引用,函数调用和结构函数;12.表达式求值:整型提升、算术转换、操作符的属性;练习:使用函数完成整型函数的打印、元素逆置】-2
12.表达式求值 1. 表达式求值的顺序一部分是由操作符的优先级和结合性决定。 2. 有些表达式的操作数在求值的过程中可能需要转换为其它类型。
108 0