使用无符号值在阵列上操作

时间:2017-07-05 14:49:51

标签: c matlab matlab-coder

我一直在从Matlab Coder环境中生成一个C函数,以便在另一个名为MAX / MSP的软件中实现它。 由于我的C编程水平很差,我试图理解它,并且有一些我无法理解的语法元素:使用无符号值(如0U或1U)来传递数组。

下一个例子没有做任何事情。除非你这么认为,否则粘贴整个代码并不会有多大帮助。

void function1(const double A[49], double B[50])
{
  function2( (double *)&A[0U] );
}

static void function2(const double A[])
{

}

在做数学时,Matlab写了类似的东西:

b = 2;
f[1U] += b;

我不理解无符号值的使用......

非常感谢!

2 个答案:

答案 0 :(得分:2)

此处显然不需要U后缀。在某些情况下强制使用未签名的算术会很有用,但会产生令人惊讶的副作用:

if (-1 < 1U) {
    printf("surprise!\n");
}

在极少数情况下,有必要避免某些类型更改。在许多当前体系结构中,以下比较成立,2147483648的类型与2147483648U的类型不仅仅是签名:

例如,在32位Linux和32位和64位窗口上:

sizeof(2147483648) == sizeof(long long)  // 8 bytes
sizeof(2147483648U) == sizeof(unsigned)  // 4 bytes

在许多具有16位整数的嵌入式系统上:

sizeof(2147483648) == sizeof(long long)       // 8 bytes
sizeof(2147483648U) == sizeof(unsigned long)  // 4 bytes
sizeof(32768) == sizeof(long)                 // 4 bytes
sizeof(32768U) == sizeof(unsigned int)        // 2 bytes

根据实现细节,数组索引值可以超出类型int和类型unsigned的范围,指针偏移值可以更大。仅指定U并不保证任何事情。

答案 1 :(得分:2)

对于a[n],数组索引始终为非负值,从0n-1。将u附加到十进制常量对于索引数组没有任何问题,但确实提供了一个好处:它确保该值具有最小类型宽度和一些 unsigned 类型。

使用u后缀自动生成固定索引,就像使用Matlab一样。

考虑32位unsigned/int/long/size_t系统上的小值和大值

aweeu[0u];           // `0u` is 32-bit `unsigned`.
aweenou[0];          // `0` is 32-bit `int`.
abigu[3000000000u];  // `3000000000u` is a 32-bit `unsigned`.
abignou[3000000000]; // `3000000000` is a 64-bit `long long`.
这是有价值的吗?也许。有些编译首先查看,看看上面的所有内容都在size_t的范围内而不是抱怨。其他人可能会抱怨类型long long或甚至可能int的索引。通过追加u,不会发生这种罕见的抱怨。