问题标签 [signedness]
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 - gcc 常量的隐含符号
我在 gcc 对常量符号的解释中遇到了一些有趣的行为。我有一段代码(大大简化)如下所示:
当我编译上述内容时,我得到了warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
一切都很好 - 似乎 gcc 将十六进制常量解释为无符号,并且不喜欢与有符号整数进行比较。但是,如果我将定义更改为类似#define SPECIFIC_VALUE 0x7FFFFFFF
的内容,警告就会消失。同样,我并不感到特别惊讶——符号位为零会使 gcc 更乐意将常量解释为有符号值。真正让我吃惊的是,如果我将定义更改为#define SPECIFIC_VALUE INT32_C(0xFFFFFFFF)
,我仍然会收到警告。我希望明确告诉编译器将我的常量解释为有符号值会使警告静音。
c - 传递参数中的指针目标在符号上不同
我已经阅读了类似的问题,但在这种情况下,我无法找到一个可以帮助我理解此警告的问题。我在尝试学习 C 的第一周,所以提前道歉。
我收到以下警告并注意:
尝试编译此代码时:
我删除了无用的部分,包括打开端口和初始化 fs 的部分。
clojure - 右移 32 位整数
Clojure 的位移操作似乎都返回 64 位long
结果,即使对于 32 位int
参数也是如此。这不是一个实质性问题bit-shift-left
:
但是,这成为负数无符号右移的问题:
正确的答案当然是0f234567
。
在 Clojure 中实现 32 位无符号右移的最有效方法是什么?
c - 有符号整数模无符号整数会产生无意义的结果
我需要在 C 中执行一个真正的数学模运算。对我来说,对于 moduled 参数允许负数是有意义的,因为我的模计算会产生负的中间结果,必须将其放回最小残留系统。但是允许负模块是没有意义的,因此我写了
但是用负数和正模块调用这样的函数
产生输出
我不明白为什么。你能解释一下吗?
编辑:我知道运算符 % 不同于数学模,我知道它是如何定义正数和负数的。我在问它会为不同的签名做些什么,而不是不同的签名。
c++ - 为什么 fstream.read 和 fstream.write 使用 char 而不是 unsigned char?
据我所知,read()
是否write()
可以直接从文件读取字节或向文件写入字节,并且我被告知byte
c++ 中的 a 等价物是unsigned char
,那么为什么它们将char
指针作为参数?
另外,请从我发现的“bmp 文件图像阅读器”库中查看此函数:
为什么这_ifs->read()
条线仍然有效?从 unsigned char 转换为 char 强制数据丢失,不是吗?
python - gdb python pretty printer uint64_t 被解释为签名
当我尝试使用时:
它打印
2929725441843584891:28a879c45a82df7b
But also
9918728419520062851:-7659990ddaef5a7d
当最高有效位设置为val
时,它被解释为有符号。
fData[]
是uint64_t
。
我怎样才能避免这种情况?我所有的值都应该是无符号的。
c++ - Visual Studio 2015:std::make_unique 中没有带符号/无符号不匹配警告?
我刚刚在我的代码中发现了一个错误,我很困惑它可能会发生,因为它是一个简单的有符号/无符号不匹配 - 这根本不应该发生,因为我正在编译警告级别 4,警告为错误。所以我试图重现它,这很简单:
现在我问自己:这是什么原因?它是 VS 中的错误,还是 std::make_unique 的普遍缺点?有什么办法可以解决吗?(Visual Studio 2015 社区更新 3)
c - 无法对齐“指针目标签名”
我一直在为这个问题苦苦挣扎一段时间,这段代码
给我错误
初始化中的指针目标在符号上不同 [-Wpointer-sign]
在以下代码中将其更改为仅char *
或unsigned char *
不产生影响,并const char *
导致程序进一步抱怨应该使用 PMTK 的位置:
该程序应该使用 HAL 驱动程序建立从 STM32F0xx 到 GPS 接收器 (SIM33ELA) 的 uart 通信。
assembly - x86 程序集中的冲突符号:movsx 然后是无符号比较/分支?
我对以下代码段感到困惑:
这似乎有冲突。Var_8 似乎是在它得到符号扩展的帐户上签名的。然而, jnb 暗示 var_8 未在帐户上签名,它是未签名的比较。
那么,var_8 是有符号的还是无符号的?那么arg_0呢?
c - 函数返回类型是无符号的,而它返回 -1 表示错误
我已经使用 libnet 一段时间了,我注意到有一些函数的返回值是uint32_t
,据我了解,它是无符号类型。但是,在文档中,它说如果发生错误(这是有符号类型)返回 -1 libnet_get_ipaddr4
,libnet_get_prand
例如,请参见。
但是,我可以毫无问题地使用这些功能:
if ((src_ip_addr = libnet_get_ipaddr4(l)) == -1) {
/* treat the failure*/
}
我想比较发生在 -1 解释为 unsigned int 与返回值之间,返回值取相同的值;比较是真的。
尽管这显然有效,但我的问题是:这有意义吗?为什么?作为程序员,我应该如何检查返回值以了解是否发生错误?上面显示的代码片段是否正确?