假设ab
和cd
都声明为unsigned char*
类型。下面的代码片段中的行为是否定义良好?我关注的是在1
时向cd[k]
添加cd[k] = 255
,预期的行为是比较ab[k] > cd[k] + 1
将与b[k] > 256
等效?不是b[k] > 0
?这是对的吗?
if (ab[k] > cd[k] + 1)
{
r = 1;
}
else if (cd[k] > ab[k] + 1)
{
r = -1;
}
答案 0 :(得分:4)
根据C11标准草案N1570,§6.3.1.1.2:
如果
int
可以表示原始类型的所有值(如 受宽度限制,对于位字段),将值转换为int
;否则,它将转换为unsigned int
。这些是 称为整数促销。 58)所有其他类型均未更改 整数促销。
[...]
58)整数促销是通常的一部分 算术转换,到某些参数表达式,到 一元+
,-
和~
运算符的操作数,以及两个操作数的操作数 移位运算符,由各自的子条款指定。
简而言之,每个类型小于int
或unsigned int
的表达式都会分别转换为int
或unsigned int
。
int
必须至少16位宽,因此绝对不会发生回绕,并且您的表达式将产生256
。