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'在整个具体指定这是一个无符号长?
7条答案
按热度按时间7kqas0il1#
我觉得很多答案都忽略了后缀有用的一个重要原因,当使用无符号长整型作为r值时,它可以使代码看起来更干净。
假设您需要检查位域中的第6位是否打开,使用后缀时代码看起来非常简洁......
不使用后缀...
正如你所看到的,这里不使用后缀迫使我们执行一个难看的内联类型转换,这样我们就可以与一个正的最低有效位进行比较,但是后缀允许我们创建一个无符号长整型作为一个r值,以便快速使用。
ut6juiuv2#
它只是C++中的另一个工具;如果你不需要就不要用它!
cld4siwp3#
在你提供的例子中,后缀是不需要的。但是表达式中经常使用后缀来防止精度损失。例如:
如果省略UL后缀,比如说如果系统有16位int和32位long,可能会得到不同的答案。
下面是另一个受理查德·科登评论启发的例子:
同样,如果你有16位或32位整数,如果你不加后缀,你会得到不同的答案。
同样的问题也适用于32位和64位的int类型,以及在表达式中混合long和long long类型。
mf98qq944#
我想有些编译器可能会发出警告。
作者这样做可能是为了确保代码没有警告?
piok6c0g5#
对不起,我知道这是一个相当老的问题,但我在c++11代码中使用了很多...
ul
,d
,f
对于将auto
变量初始化为您想要的类型都很有用,例如:checkout 数字文本的cpp引用:http://www.cplusplus.com/doc/tutorial/constants/
nc1teljy6#
你通常不需要它,任何可以接受的编辑器都有足够的帮助来保持事情的正确性。* 然而 *,我在C#中使用它的地方是(你会在C++中看到这些):
unsigned long
类型的泛型方法。这种情况经常发生,包括最近的这一次:Tuple<ulong, ulong> = Tuple.Create(someUlongVariable, 0UL);
如果没有
UL
,则返回Tuple<ulong, int>
,并且不会编译。var
关键字或C++中使用auto
关键字的隐式变量声明。这对我来说不太常见,因为我只使用var
来缩短非常长的声明,而ulong
正好相反。gg58donl7#
当你觉得有义务写下常量的类型时(即使不是绝对必要),你要确保:
1.你总是考虑编译器如何将这个常量转换成位
1.任何读过你代码的人都会知道你认为常量是什么样子的,并且你考虑过它(即使是你,当你重新扫描代码时)
1.你不需要花时间考虑是否需要写“U”/“UL "
另外,一些软件开发标准,如MISRA,要求您无论如何都要提到常量的类型(如果没有符号,至少写上“U”)
换句话说,有些人认为编写常量类型是一种好的实践,因为在最坏的情况下,您只需忽略它,而在最好的情况下,您可以避免错误,避免不同的编译器以不同的方式处理您的代码并提高代码的可读性