- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
(...)"吗?-6ren"> (...)"吗?-我正在修改对硬编码常量使用“long long”( LL) 数据类型定义的遗留代码,如下所示: 0xFFFFFFFFFFFFFFFFLL 我相信 LL附加到常量保证该常量将被解释为 long long-6ren">
我正在修改对硬编码常量使用“long long”( LL
) 数据类型定义的遗留代码,如下所示:
0xFFFFFFFFFFFFFFFFLL
我相信 LL
附加到常量保证该常量将被解释为 long long
.
但是,我不想依赖long long
在位数方面具有任何特定的依赖于编译器的解释。
因此,我希望我的变量声明没有 LL
在常量中,而是使用:
uint64_t a = static_cast<uint64_t>(0xFFFFFFFFFFFFFFFF);
我想认为常量 0xFFFFFFFFFFFFFFFF
在转换为 uint64_t
之前,编译器不会将其解释为 32 位整数,这将导致 a
是包含值 0xFFFFFFFF
的 64 位整数, 而不是期望值。
(我目前感兴趣的 64 位编译器是 VS 2010 和 Ubuntu 12.04 LTS GCC。但是,我希望这段代码能够以任何现代编译器所需的方式运行。)
对于大多数或所有现代编译器,上面的代码是否会按预期工作,所以 a
的值是多少?根据需要,已正确设置为包含常量 0xFFFFFFFFFFFFFFFF
中的所有数字, 不包括 LL
在常量的末尾?
(注意:在常量末尾包含 I64
会导致编译器错误。也许还有另一个标记需要(或可以)包含在常量末尾以告诉编译器将常量解释为64 位整数?)
(另外:也许 static_cast<uint64_t>
是不必要的,因为该变量被显式定义为 uint64_t?)
最佳答案
为了减少 Andy 所说的要点:如果实现具有一种或多种能够表示 0xFFFFFFFFFFFFFFFF
的标准整数类型,然后是文字 0xFFFFFFFFFFFFFFFF
有一个这些类型。
对你来说,哪一个并不重要,因为无论是哪一个,转换为 uint64_t
的结果都是是一样的。
如果(C++11 之前的)实现没有任何足够大的整数类型,则 (a) 程序格式错误,因此您应该进行诊断; (b) 它可能不会有uint64_t
无论如何。
你是对的 static_cast
是不必要的。它执行与分配给 uint64_t
相同的转换无论如何都会做。有时,强制转换会抑制针对某些隐式整数转换获得的编译器警告,但我认为在这种情况下,任何编译器都不太可能针对隐式转换发出警告。通常不会有一个,因为 0xFFFFFFFFFFFFFFFF
通常会有类型 uint64_t
已经。
顺便说一句,最好写成static_cast<uint64_t>(-1)
, 或者只是 uint64_t a = -1;
.它保证等于 0xFFFFFFFFFFFFFFFF
, 但读者更容易看出 -1
之间的区别和 0xFFFFFFFFFFFFFFF
不如看看0xFFFFFFFFFFFFFFFF
之间的区别和 0xFFFFFFFFFFFFFFF
.
关于c++ - 可以从硬编码整数常量中删除 "LL"并替换为 "static_cast<uint64_t>(...)"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15769226/
为了进一步了解解析器和语法,我正在寻找 LL(2) 但不是 LL(1) 的语言示例(希望是简单的)。也就是说,一种可以由 LL(2) 语法生成但不能由任何 LL(1) 语法生成的语言。 该类(clas
$ cat png.ll ./packages/apps/Mms/res/mipmap-hdpi/ic_launcher_smsmms.png ./packages/apps/Mms/res/draw
我最近试图自学解析器(用于语言/上下文无关语法)如何工作,除了一件事之外,大多数内容似乎都是有意义的。我特别关注 LL(k) 语法,其中两个主要算法似乎是 LL parser (使用堆栈/解析表)和
我正在研究上下文无关语法,并且我陷入了第一步:了解自顶向下解析算法的结构。 我的问题围绕自上而下的解析器。我向我介绍了三种算法: 递归下降 预测性 预测递归下降 问题 但不明白如何将它们联系起来。所以
我有三种语法: A -> aB |乙| CBB B -> aB |巴| aBb C -> aaA |乙| caB 我需要“通过执行成对不相交测试来确定[它们]是否是 LL 语法,显示每个非终结符的每个
我已经在转换它上浪费了很多时间,但我总是起床得到公共(public)前缀 ID。 谁能给我解释一下?因为我正在尝试为一个非常大的语法做这件事并且需要我的基础知识清楚。 A、B、C、D 是仅有的非终结符
如果我定义了以下结构: typedef struct bear_t { char* name; void (*eat)(struct bear_t* this); void (
我在 Internet 上找不到任何关于 LL(*) 解析器的完整描述,例如 ANTLR。 我想知道 LL(k) 解析器和 LL(*) 解析器之间的区别是什么,以及为什么它们不支持左递归语法,尽管它们
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
LL 是否在标准中的任何地方定义(很难找到)? ideone接受代码 int main() { std::cout int main() { // Won't fire st
我的任务是将此语法转换为 LL(1) E → E+E | E-E | E*E | E/E | E^E | -E | (E)| id | num 所以对于第一步,我消除了歧义并得到了这个: E → E+
我了解 LL 递归下降解析器如何处理这种形式的规则: A = B*; 使用一个简单的循环,根据前瞻标记是否与 B 的第一组中的终端匹配来检查是否继续循环。但是,我对基于表的 LL 解析器很好奇:这种形
我有以下语法: S → a S b S | b S a S | ε 由于我正在尝试为其编写一个小型编译器,因此我想将其设为 LL(1)。我看到这里似乎存在 FIRST/FOLLOW 冲突,我知道我必须
我有一个语法,我可以检查 is 是否是 LL(1)。但是,有什么方法可以检查语法生成的语言是否为LL(1)? LL(1) 语法和 LL(1) 语言之间到底有什么区别? 最佳答案 任何 LL(1) 语法
好吧,我所说的 LL(k) 语言是指其解析器可以用 LL(k) 语法描述的编程语言。 这些是我的猜测: 帕斯卡 口齿不清 xml 和 friend 最佳答案 这取决于“语言”的定义。如果你问 What
我想解析一种编程语言。我读了很多关于形式语言、乔姆斯基层次结构和 ANTLR 的内容。但我找不到有关如何将 ANTLR v3 作为 LL(*) 递归下降解析器接受的语言与乔姆斯基层次结构相关联的信息。
我似乎无法弄清楚为什么在双向链表的末尾插入节点会陷入循环。要么陷入循环,要么陷入空指针。另外我想知道在处理链表或任何数据结构时 public Node 更好还是 public void 更好。 pub
我有一个程序,当前将生成 token 输出,用于下一个程序的输入。它将检查代码语法的正确性。 我遇到了如何开始将此语法转换为可用程序的问题。 下面是语法使用,我将如何着手制作它。或者哪里有好的资源可以
这个问题已经存在: Hello, it shows me two letter "L",but i would like to see full letters like "hello" but in
我正在尝试编译一个有 -ll 标志但 gcc 找不到的程序。 -l 之后的 l 是什么,真的是一个库还是错字?很难在谷歌上找到关于这个的信息。这样的术语是“模糊的”。 最佳答案 -ll 表示链接Sol
我是一名优秀的程序员,十分优秀!