![](/img/trans.png)
[英]How does casting between Cs default int type and <stdint.h>'s intXX_t types work?
[英]How does type conversion and integer promotion work for stdint.h?
在 C 中,我了解标准类型的类型转换、integer 提升、转换等,但是 stdint.h 类型如何影响这一点?
对于类型排名,规则 state:
那么假设一个 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 类型)
- ...和(对于带符号的类型)具有二进制补码表示的,它应定义相应的 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_t
与unsigned int
的类型相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.