使用无符号值对数组进行操作
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]
,数组索引总是非负值,从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`.
这个有价值吗?也许。一些编译首先查看 value 并看到以上所有内容都在 size_t
范围内并且没有抱怨。其他人可能会抱怨 long long
甚至 int
类型的索引。通过附加 u
,这种罕见的投诉就不会发生。
我一直在从 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]
,数组索引总是非负值,从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`.
这个有价值吗?也许。一些编译首先查看 value 并看到以上所有内容都在 size_t
范围内并且没有抱怨。其他人可能会抱怨 long long
甚至 int
类型的索引。通过附加 u
,这种罕见的投诉就不会发生。