在C语言中,当我使用整数作为数组索引时,是否会触发常规算术转换规则将数组索引转换为某种整数类型?如果是,它会转换成哪种整数类型?
示例1:
这会触发整数转换或提升吗?如果是,
如果索引的类型不是
我也对指针算术的同样问题感兴趣,例如表达式
我查看了关于理解整数转换的CERT Secure Coding指南和OWASP整数溢出概述,但两者都没有描述这种情况。下面的StackOverflow问题也没有: 整数转换(缩小,扩大),未定义行为。
示例1:
int i = ...;
... a[i] ...
这个操作会触发整数转换或提升吗?如果是,i
会被转换成什么类型? (unsigned int
? size_t
? 还是其他类型?)
例子2:
unsigned int j = ...;
... b[j] ...
这会触发整数转换或提升吗?如果是,
i
会转换成什么类型?如果索引的类型不是
int
,那么它何时进行整数转换的规则是什么?是否应用了通常的算术转换规则,还是其他规则?我也对指针算术的同样问题感兴趣,例如表达式
p+i
,其中p
是一个指针,i
是某种整数类型。我查看了关于理解整数转换的CERT Secure Coding指南和OWASP整数溢出概述,但两者都没有描述这种情况。下面的StackOverflow问题也没有: 整数转换(缩小,扩大),未定义行为。
int
还是其他类型 - 如果是其他类型,那么是哪种类型?管理此情况的规则是什么?我可以找到通常算术转换的文档,但它们似乎假定我已经知道目标类型应该是什么,而我无法确定数组索引的目标类型应该是什么。 - D.W.i
的类型比int
更大,则如何处理:long
,size_t
,unsigned long
等。但这对我来说不是很重要。) - D.W.ar [1.01]
并期望从double
到int
的晋升发生,因为它用作下标索引; 它不会。但是,只要x + y * z
在完成其“我需要转换以满足此表达式”的操作后得出整数类型,您就可以执行ar [x + y * z]
。我无法比这更好地描述它(至少在我阅读它时)。 - WhozCraig