C语言中的数据类型升级或降级

C语言中的数据类型升级或降级,c,types,C,Types,以下哪些是数据类型升级和降级: char ch = 'C'; int i = 65; float fl = 2.2; ch = ch + 1; i = fl + 2 * ch; fl = 2.0 * ch + i; ch = 5212205.17; 如果我说: 推广: i=fl+2*ch fl=2*ch+i 降级: ch = 5211205.17; 不确定是否 ch = ch + 1; 这也是降级。。请帮助:)在ch=ch+1中这里1是一个整数,所以ch被提升为整数并加上1,

以下哪些是数据类型升级和降级:

char ch = 'C';
int i = 65;
float fl = 2.2;

ch = ch + 1;
i = fl + 2 * ch;
fl = 2.0 * ch + i;
ch = 5212205.17;
如果我说:

推广:

  • i=fl+2*ch

  • fl=2*ch+i

降级:

  ch = 5211205.17;
不确定是否

  ch = ch + 1;

这也是降级。。请帮助:)

ch=ch+1中这里1是一个整数,所以
ch
被提升为整数并加上1,然后结果被降级为字符并存储在ch中。

在C编程中,我从来没有听说过“数据类型降级”这样的概念

“升级”通常用于表示将一个“小”类型转换为一个较大类型的事实,该类型在编译程序的平台上是原生的

例如,在x86上,gcc将8位字符提升为32位整数,因为x86处理器的ALU处理32位整数字

回到你的问题上来,要么是关于隐式类型转换,要么我们错过了一些上下文来说明哪个变量将被提升

免责声明:看起来你可能正在准备考试,在这种情况下,你应该遵守老师的惯例。也许他将整数或浮点类型隐式转换为更大的整数(分别是浮点类型)称为提升,将小数部分截断称为降级,或将整数溢出称为降级

char ch = 'C'; 
文本
'C'
的类型为int,并降级为char(在赋值过程中转换为左运算符)

文本
2.2
double类型,并降级为float类型(赋值期间转换为左运算符)

变量ch的类型为char,并升级为int(整数升级)类型

添加
ch+1
的结果为int类型,并降级为char类型(在赋值过程中转换为左运算符)

变量ch的类型为char,并升级为int(整数升级)类型

2*ch
的结果为类型int,并提升为类型float(平衡)

fl+2*ch
的结果是类型float。浮点被降级为int(赋值期间转换为左运算符)。这是一种危险的转换,因为会丢失精度,如果一个好的编译器试图在没有显式强制转换的情况下将浮点存储在int中,则应该发出警告

fl = 2.0 * ch + i;
变量ch的类型为char,首先升级为int(整数升级),然后升级为double(平衡)

2.0*ch
的结果为double类型

2.0*ch+i
的结果为类型double,并降级为类型float(在赋值过程中转换为左运算符)

文字5212205.17的类型为double,并降级为char(赋值期间转换为左运算符)。这是一种危险的转换,也可能是未定义的行为,因为char的签名是由实现定义的,并且数字不能放入char中


试图在不能表示有符号浮点数的类型(如无符号整数)中存储有符号浮点数是未定义的行为,即严重错误。

所以它既是降级又是升级。。还是降级?谢谢@user3227610第一次升级,最后是降级。感谢您逐一解释!多亏了你,我对它们有了更好的理解:)正如你能从中看出的那样,理解你的程序实际使用的类型是非常重要的。常量文字既有类型,也有任何变量,它们遵循相同的转换规则。您使用的文字语法决定了类型,从而决定了程序的结果<代码>1
1.0
1.0f
1U
1L
1UL
'1'
“1”
等等,都是各种不同的类型。不理解这一点或不理解隐式升级的程序员将编写数百个难以发现的bug。学习起来并不容易,即使是经验丰富的程序员也很难做到这一点。完整的解释很好。添加的想法:
long
float
提升可能会失去精度。与4字节
long
2147483647到
float
一样,它变为2147483648。0@chux当然,是否会丢失精度取决于内置类型的性质。使用什么浮点格式,长的有多大等等。这反过来让人意识到,除非你非常非常小心,否则这样的代码不可能是可移植的。@lundin感谢你的全面回答。你能解释一下签名的降级/升级吗?C标准中确实有“升级”的正式定义,但没有“降级”的正式定义。然而,C标准在非规范性文本中确实提到了类型降级。我们非正式地称之为降级,正式地称之为简单分配期间的转换或类似的转换,在C116.5.16.1中有规定。
ch = ch + 1;
i = fl + 2 * ch;
fl = 2.0 * ch + i;
ch = 5212205.17;