繁体   English   中英

stdint.h 的类型转换和 integer 提升是如何工作的?

[英]How does type conversion and integer promotion work for stdint.h?

在 C 中,我了解标准类型的类型转换、integer 提升、转换等,但是 stdint.h 类型如何影响这一点?

对于类型排名,规则 state:

  • 任何两个带符号的 integer 类型都不应具有相同的等级,即使它们具有相同的表示形式。
  • 任何无符号 integer 类型的等级应等于相应有符号 integer 类型(如果有)的等级。

那么假设一个 int 是 32 位的,这是否意味着int > int32_t = uint32_t > short int在排名中?

另外,stdint.h 类型是否也受 integer 提升的影响? 例如,如果我尝试向 uint32_t 添加一个带符号的字符,它们都会被提升为无符号整数吗?

回答你的第一个问题:没有。 由于int32_t通常是用这样的 typedef 定义的

typedef int int32_t;

它与int相同,并且与int具有相同的等级。

回答第二个问题:是的。 Integer促销仍然适用。 stdint.h 中定义的类型的行为就像它们作为别名的类型一样。

顺便说一句,为了对你的编译器的行为更有信心,你可以在你的编译器中测试所有这些东西,方法是编写这样的无效代码并仔细查看错误消息,这将(如果你有一个好的编译器)揭示右侧表达式的类型:

void * x = (signed char)-1 + (uint32_t)0;

按照C标准

— 任何标准 integer 类型的等级应大于任何具有相同宽度的扩展 integer 类型的等级。

2 的补码表示的确切 integer 类型被定义为标准 integer 类型的 tyoedef 别名。

来自 C 标准(7.20.1.1 精确宽度 integer 类型)

  1. ...和(对于带符号的类型)具有二进制补码表示的,它应定义相应的 typedef 名称。

所以当类型 int 有 32 位时这个关系(对于 2 的补码表示)

int > int32_t = uint32_t > short int

是正确的,除了关系int > int32_t前提是类型int32_t是 typedef 声明引入的类型int的别名。

另外,stdint.h 类型是否也受 integer 提升的影响? 例如,如果我尝试向 uint32_t 添加一个带符号的字符,它们都会被提升为无符号整数吗?

这里unsigned char类型的 object 被提升为int类型,并且uint32_t类型的 object 被提升为unsigned int类型(假设int具有 32 位)由于 integer 提升

来自 C 标准

如果 int 可以表示原始类型的所有值(受宽度限制,对于位域),则该值被转换为 int; 否则,它被转换为一个无符号整数。 这些称为 integer 促销。 58) integer促销后所有其他类型不变。

然后由于通常的算术转换, int类型的 object 被转换为unsigned int类型。

来自 C 标准(6.3.1.8 常用算术转换)

否则,两个操作数都转换为无符号 integer 类型,对应于带符号 integer 类型的操作数的类型。

请注意名称uint32_t可以是 typedef 声明引入的类型unsigned int的别名。 在这种情况下, uint32_tunsigned int的类型相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM