使用无符号值对数组进行操作

Operating on arrays using Unsigned Values

我一直在从 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;

我也不明白unsigned value的用法...

非常感谢!

U后缀在这里显然是不需要的。在某些情况下强制执行无符号算术可能很有用,但会产生令人惊讶的副作用:

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

在一些极少数情况下,需要避免一些类型的改变。在许多当前的体系结构上,以下比较成立并且 2147483648 的类型与 2147483648U 的类型不同不仅仅是符号:

例如,在 32 位 linux 以及 32 位和 64 位 windows 上:

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 并不能保证任何事情。

对于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`.

这个有价值吗?也许。一些编译首先查看 value 并看到以上所有内容都在 size_t 范围内并且没有抱怨。其他人可能会抱怨 long long 甚至 int 类型的索引。通过附加 u,这种罕见的投诉就不会发生。