【问题标题】:Operating on arrays using Unsigned Values [closed]使用无符号值对数组进行操作[关闭]
【发布时间】:2017-12-09 07:39:54
【问题描述】:

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

我也不明白无符号值的使用...

非常感谢!

【问题讨论】:

  • 向 C++ 标签发送垃圾邮件的原因是什么?而且我们不是一个“解释代码”的网站。如果您想了解 C,请阅读一本好的 C 书籍。
  • @Olaf:如果你今天过得很糟糕,那就请假吧 ;-)
  • @chqrlie:我今天过得很好。只是那些不阅读规则甚至不接受tour 的人在最终注册期间出现并提出每个初学者书中解释的明显问题。
  • @Olaf:OP 似乎知道U 后缀的含义,他想知道代码生成器为什么要使用它,坦率地说,我也是。
  • 感谢@JohnBollinger 的回答,我需要的信息!

标签: c matlab matlab-coder


【解决方案1】:

对于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,不会发生这种罕见的投诉。

【讨论】:

  • UVd,你说得比我好。
【解决方案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

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

【讨论】:

  • sizeof(2147483648) == sizeof(long) sizeof(2147483648U) == sizeof(unsigned) - 这些都不能保证。而且他们经常是错的。
  • @Olaf:你是对的,这些都不能保证,我修改了我的答案,但它们通常是正确的。
  • 并非如此。对于 WINdows 来说这是错误的,对于大多数系统中 int 小于 32 位的所有 CPU 来说都是错误的。
  • @Olaf:你脾气暴躁,但正确。我再次修改了答案。就系统数量而言,我同意它们可能是更多具有小整数的系统,但就程序员数量而言,为 32 位和 64 位系统编程的人可能比嵌入式目标多。
  • 感谢您的回答和回答我的问题的小例子!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多