首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在什么情况下,一个值将被提升为一个未签名的int?

在什么情况下,一个值将被提升为一个未签名的int?
EN

Stack Overflow用户
提问于 2019-08-15 07:57:44
回答 1查看 107关注 0票数 1

根据标准C11 p6.3.1.1

如果int可以表示原始类型的所有值(受宽度限制,用于位字段),则将该值转换为int;否则,将其转换为无符号int。这些被称为整数提升。58)所有其他类型都不受整数提升的影响。

我很好奇,在什么情况下,一个价值会被提升为一个unsigned int?像short int这样的类型绝对适合有符号int,即使我在struct中将31位定义为位字段,它仍然适合有符号int。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-15 09:01:35

在这种情况下,提升等级低于int的整数类型的最大值。因此,当平台上的unsigned shortunsigned charcharunsigned时,就会发生这种情况。

USHRT_MAX大于INT_MAX时,unsigned short被隐式提升为unsigned int类型。类似地,当UCHAR_MAX大于INT_MAX时,unsigned char被提升为unsigned int类型。而且,当平台上的charunsigned,而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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57506535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档