根据标准C11 p6.3.1.1
如果int可以表示原始类型的所有值(受宽度限制,用于位字段),则将该值转换为int;否则,将其转换为无符号int。这些被称为整数提升。58)所有其他类型都不受整数提升的影响。
我很好奇,在什么情况下,一个价值会被提升为一个unsigned int?像short int这样的类型绝对适合有符号int,即使我在struct中将31位定义为位字段,它仍然适合有符号int。
发布于 2019-08-15 09:01:35
在这种情况下,提升等级低于int的整数类型的最大值。因此,当平台上的unsigned short、unsigned char和char是unsigned时,就会发生这种情况。
当USHRT_MAX大于INT_MAX时,unsigned short被隐式提升为unsigned int类型。类似地,当UCHAR_MAX大于INT_MAX时,unsigned char被提升为unsigned int类型。而且,当平台上的char是unsigned,而UCHAR_MAX大于INT_MAX时,char也是如此。
_Bool将始终转换为int。虽然_Bool中的位数至少是CHAR_BIT,但是_Bool的宽度是1位,所以int总是能够表示所有的_Bool值。(我不确定标准的“受宽度限制”部分是否只适用于位字段或所有经过转换的类型。在"for a bit-field“部分之前有一个逗号。)
这篇文章是关于C++的,但我想重新评论一下:没有人知道焦炭的种类。。它触及了确切的问题-- char + char可以是int,也可以是unsigned int,这取决于char是否是无符号的,如果char可以保存更大的值,则取决于int。
即使我将结构中的31位定义为位字段,它仍然适合有符号的int。
不总是这样。可以用宽度为31位的位字段结构成员表示的值范围可能不适合于signed int变量。简单地说,signed int在特定的体系结构上可能有30位或更少的位。signed int必须至少在-32767到+32767之间表示值。因此,2^31可能不适合signed int。
https://stackoverflow.com/questions/57506535
复制相似问题