问题标签 [strtoull]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - C: 将字符串转换为 unsigned long long 错误
我只是想在一个变量中转换一个String
(从文件中的一行读取) 。long long
我的问题是我得到分段错误,我不知道为什么......这是代码:(我在“3° Call”函数上对错误发表了评论)
这是我要阅读的文件,它是一个简单的.txt
文件:
c - strtoull("-1", NULL, 0) 和其他负值的令人惊讶的行为
strtoull("-1", NULL, 0)
在我测试的系统(OS/X 与 Apple Libc,Linux 与 Glibc)上评估为18446744073709551615
, (0xFFFFFFFFFFFFFFFF
又名ULLONG_MAX
)。
既然strtoull
应该检查返回类型范围之外的值,为什么它不返回0
所有负值?
编辑:周围的行为-ULLONG_MAX
似乎也不一致:
c++ - strtoull() 的输出在转换为双精度然后返回到 uint64_t 时会丢失精度
考虑以下:
哪个打印:
第一个数字只是ULLONG_MAX
从字符串转换为 a的结果uint64_t
,它按预期工作。
但是,如果我将结果转换为double
,然后再转换为uint64_t
,那么它会打印0
第二个数字 。
通常,我会将其归因于浮点数的精度不准确,但更让我感到困惑的是,如果我将ULLONG_MAX
fromuint64_t
转换为double
然后返回 to uint64_t
,结果是正确的(第三个数字)。
为什么第二个和第三个结果之间存在差异?
编辑(@Radoslaw Cybulski)对于另一个在这里发生的事情,试试这个代码:
愉快地打印:
c++ - 如何解析包含整数的字符串并检查是否大于C++中的最大值
我想确定(在 C++ 中)一个字符串是否包含一个在 0 - UINT_MAX 范围内的数字我已经尝试过 atoi 等,但不处理这种情况。例如字符串 42949672963 将无法通过测试有没有人有任何建议?
c++ - walk, strol 函数没有为 long_min 提供正确的输出
对于以下代码
输出是
为什么l1
不是long_min
,为什么是l2
?我读过该字符串可以在 ato*,strto* 函数的开头包含+
/-
符号。-
但是二进制中的负数在计算机使用的 2 的补码中没有任何符号。我很困惑。
c - 为什么使用左移位运算符后前两位数字丢失?
我将十六进制值存储在 uint64_t 变量中。当我调用strtoull()
将字符串转换为十六进制值时,我得到了正确的结果,但是当我左移 ( <<
) 32 时,我丢失了前两位数。
我正在测试的字符串是"398a59b412"
. 我希望能回来398a59b41200000000
,但我得到的不是这个8a59b41200000000
。
c - strtoull() 在 C89 中的可用性
我从这里开始阅读 strtoul()/strtoull() 的文档,在“符合条件”部分的底部,它说明了这两点:
strtoul():POSIX.1-2001、POSIX.1-2008、C89、C99 SVr4。
strtoull():POSIX.1-2001、POSIX.1-2008、C99。
除了整个文档中的其他参考资料外,这两行向我表明,在使用 c89/c90 标准编译程序时,函数 strtoull 不应该可用。但是,当我使用 gcc 运行快速测试时,它允许我调用此函数,而不管我指定的标准是什么。
首先,我用来测试的代码:
这是我的编译命令:
现在,公平地说,它确实警告我兼容性问题:
鉴于文档,这些警告消息正是我所期望的。它通知我找不到我指定的功能,甚至 C90 标准不支持unsigned long long
. 但是,当我尝试运行此代码时,它运行良好,没有崩溃或其他类型的错误。它根据需要打印 value 1234
。所以,基于这个实验,我有几个问题我希望有人比我更有经验。
- 这是我没有提供必要的编译标志来执行“严格”c98 标准的问题吗?
- 这是我误解文档的情况,还是我应该参考 gcc 本身的一些文档?如果是这样,我在哪里可以找到它?
- 我不理解的编译/链接过程是否有一些基本的东西,这解释了这个问题?
- 为什么我会被警告不兼容,甚至警告我正在调用的函数不存在,但代码仍然可以正常工作?
- 这个实验是否意味着这些
-std=c89 -pedantic
标志实际上并没有强制执行 C89/C90 标准?
最后一点,我并不是想说我想在 C89 中使用这个功能,我只是对兼容性限制感到好奇,然后对答案感到困惑。
提前感谢您的任何回复!
c - strtoull 是否总是返回有效数字或设置 errno?
strtoull
保证返回一个有效的数字,或者设置errno
(如果没有有效的数字可以被解析)?
换句话说,这是
正确,还是还需要进行其他检查?