我一直在从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;
我不理解无符号值的使用......
非常感谢!
答案 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]
,数组索引始终为非负值,从0
到n-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
,不会发生这种罕见的抱怨。