首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何表示常量的类型?

如何表示常量的类型?
EN

Stack Overflow用户
提问于 2014-05-14 17:07:38
回答 2查看 482关注 0票数 2

我必须用相对较少的行来编写一些函数,其中包含大量的常量。

(不用担心我写公式的方式,它只是简单地表达了这样一个事实:我在一个小包中有很多常量,这个具体的例子也很小,实际上我对每个函数都有最小的6-7个常量)

代码语言:javascript
复制
T foo( T x )
{
  return k1 * k2 * x - k3;
}

假设我对将常量声明为静态(在我的特定情况下还会导致命名约定问题) const T k1 = 42;不感兴趣,我想找到另一种选择。

一个可行的替代方案可以是

代码语言:javascript
复制
T foo( T x )
{
  return uint32_t{42} * uint32_t{21} * x - uint32_t{33};
}

在这一点上,有两个主要问题:

  • 我不确定这种声明是否会创建一个完整的对象,还是仅仅创建一个“数字”
  • 它是C++唯一的解决方案,我正在编写非常简单的函数,这些函数应该与C99+兼容。

我为什么要这么做?

很简单,这个常量的值是高度可变的,非常小的值或大的值,对于非常小的值,浪费了大量的空间,加上这个常量是数学常量,所以它们永远不会改变,我可以从第一个版本开始优化这个部分。

还有另一个方面,数字常量的默认类型是有符号整数,我想使用任意大小的无符号整数类型。

函数外的静态声明const T k1 = 42;的问题是,不同的常量具有相同的名称,由于函数的不同,常数的值是不同的,但从数学上讲,常数的名称是相同的,因此在这个解决方案中,我将在同一范围内得到相同变量的多个声明。这就是为什么我不能用名字或者这样的声明。

您对以与C++和C兼容的方式编写这篇文章有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-14 17:11:42

在C中,对于整数,可以在数字中添加'U‘、'L’或'LL‘,使它们以几个组合表示为unsignedlonglong long

代码语言:javascript
复制
a = -1LL;  // long long
b = -1U;   // unsigned
c = -1ULL; // unsigned long long
d = -1LLU; // unsigned long long
e = -1LU;  // unsigned long
f = -1UL;  // unsigned long

在C语言中,还有一个选择是使用cast。编译器很可能会做正确的事情:)

代码语言:javascript
复制
return (uint32)42 - (int64)10;

但是,正如乌阿赫在下面的注释中指出的,最好的选择可能是对整数常量(C99标准7.18.4)使用宏。

代码语言:javascript
复制
a = UINT32_C(-1); // -1 of type uint_least32_t
b = INT64_C(42);  // 42 of type int_least64_t
票数 3
EN

Stack Overflow用户

发布于 2014-05-14 22:47:13

这有什么问题吗?

代码语言:javascript
复制
inline T foo(T x)
{
    int k1 = 42;
    int k2 = 21;
    int k3 = 33;

    return 1ull * x * k1 * k2 - k3;
}

您对另一个答案的评论表明,您不确定要对常量使用哪种类型。我不认为仅仅使用常量是可表示的任何类型有什么问题。

对于计算表达式,您需要考虑中间计算的大小和符号性。在本例中,我从1ull开始使用无符号算术mod 2^64。如果您实际上想要算术mod 2^32,那么使用1ul,以此类推。

你能详细解释一下你所说的“浪费空间”是什么意思吗?这听起来好像你认为使用64位ints有一些问题。你在说什么“太空”?

另外,为了澄清,您不想声明k1全局的原因是因为k1在一个函数中的值与在另一个函数中的值不同?(与之相反,它具有相同的值,但您认为由于某种原因,它应该有不同的数据类型)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23660950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档