增加一个字节并进行比较,是否定义了这种行为?

时间:2015-12-12 21:59:12

标签: c

假设abcd都声明为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;
}

1 个答案:

答案 0 :(得分:4)

根据C11标准草案N1570,§6.3.1.1.2:

  

如果int可以表示原始类型的所有值(如   受宽度限制,对于位字段),将值转换为    int;否则,它将转换为unsigned int。这些是   称为整数促销 58)所有其他类型均未更改   整数促销。
  [...]
   58)整数促销是通常的一部分   算术转换,到某些参数表达式,到   一元+-~运算符的操作数,以及两个操作数的操作数   移位运算符,由各自的子条款指定。

简而言之,每个类型小于intunsigned int的表达式都会分别转换为intunsigned int
int必须至少16位宽,因此绝对不会发生回绕,并且您的表达式将产生256