c++ 为什么或者为什么不应该使用'UL'来指定unsigned long?

yduiuuwa  于 2023-03-20  发布在  其他
关注(0)|答案(7)|浏览(139)
ulong foo = 0;
ulong bar = 0UL;//this seems redundant and unnecessary. but I see it a lot.

我在大量引用数组的第一个元素时也看到了这一点

blah = arr[0UL];//this seems silly since I don't expect the compiler to magically
                //turn '0' into a signed value

有人能提供一些见解,为什么我需要'UL'在整个具体指定这是一个无符号长?

7kqas0il

7kqas0il1#

我觉得很多答案都忽略了后缀有用的一个重要原因,当使用无符号长整型作为r值时,它可以使代码看起来更干净。
假设您需要检查位域中的第6位是否打开,使用后缀时代码看起来非常简洁......

bool sixthBitIsOn = (bitfield >> 5) & 1ul;

不使用后缀...

bool sixthBitIsOn = (bitfield >> 5) & static_cast<unsigned long>(1);

正如你所看到的,这里不使用后缀迫使我们执行一个难看的内联类型转换,这样我们就可以与一个正的最低有效位进行比较,但是后缀允许我们创建一个无符号长整型作为一个r值,以便快速使用。

ut6juiuv

ut6juiuv2#

void f(unsigned int x)
{
//
}

void f(int x)
{
//
}
...
f(3); // f(int x)
f(3u); // f(unsigned int x)

它只是C++中的另一个工具;如果你不需要就不要用它!

cld4siwp

cld4siwp3#

在你提供的例子中,后缀是不需要的。但是表达式中经常使用后缀来防止精度损失。例如:

unsigned long x = 5UL * ...

如果省略UL后缀,比如说如果系统有16位int和32位long,可能会得到不同的答案。
下面是另一个受理查德·科登评论启发的例子:

unsigned long x = 1UL << 17;

同样,如果你有16位或32位整数,如果你不加后缀,你会得到不同的答案。
同样的问题也适用于32位和64位的int类型,以及在表达式中混合long和long long类型。

mf98qq94

mf98qq944#

我想有些编译器可能会发出警告。
作者这样做可能是为了确保代码没有警告?

piok6c0g

piok6c0g5#

对不起,我知道这是一个相当老的问题,但我在c++11代码中使用了很多...
uldf对于将auto变量初始化为您想要的类型都很有用,例如:

auto my_u_long = 0ul;
auto my_float  = 0f;
auto my_double = 0d;

checkout 数字文本的cpp引用:http://www.cplusplus.com/doc/tutorial/constants/

nc1teljy

nc1teljy6#

你通常不需要它,任何可以接受的编辑器都有足够的帮助来保持事情的正确性。* 然而 *,我在C#中使用它的地方是(你会在C++中看到这些):

  • 调用一个泛型方法(C++中的模板),其中的参数类型是隐式的,你想确保调用的是unsigned long类型的泛型方法。这种情况经常发生,包括最近的这一次:

Tuple<ulong, ulong> = Tuple.Create(someUlongVariable, 0UL);
如果没有UL,则返回Tuple<ulong, int>,并且不会编译。

  • C#中使用var关键字或C++中使用auto关键字的隐式变量声明。这对我来说不太常见,因为我只使用var来缩短非常长的声明,而ulong正好相反。
gg58donl

gg58donl7#

当你觉得有义务写下常量的类型时(即使不是绝对必要),你要确保:
1.你总是考虑编译器如何将这个常量转换成位
1.任何读过你代码的人都会知道你认为常量是什么样子的,并且你考虑过它(即使是你,当你重新扫描代码时)
1.你不需要花时间考虑是否需要写“U”/“UL "
另外,一些软件开发标准,如MISRA,要求您无论如何都要提到常量的类型(如果没有符号,至少写上“U”)
换句话说,有些人认为编写常量类型是一种好的实践,因为在最坏的情况下,您只需忽略它,而在最好的情况下,您可以避免错误,避免不同的编译器以不同的方式处理您的代码并提高代码的可读性

相关问题