【发布时间】:2015-11-15 04:15:17
【问题描述】:
在探索 linux 代码时,遇到了许多如下定义。如果 ULL 是 unsigned long long,为什么它有负值 -11?下面的宏是什么值?
#define BTRFS_FREE_SPACE_OBJECTID -11ULL
【问题讨论】:
-
long long没有标准位数。通过使用否定符号,您会得到@Barmar 在我输入时刚刚在下面评论的内容。
在探索 linux 代码时,遇到了许多如下定义。如果 ULL 是 unsigned long long,为什么它有负值 -11?下面的宏是什么值?
#define BTRFS_FREE_SPACE_OBJECTID -11ULL
【问题讨论】:
long long 没有标准位数。通过使用否定符号,您会得到@Barmar 在我输入时刚刚在下面评论的内容。
-11ULL 与 - (11ULL) 相同。 11ULL 是一个值为 11 的 unsigned long long。如果您阅读无符号类型的算术运算是如何工作的,如果数学结果不适合该范围,则最大值 + 1 会被重复添加或减去。
数学结果 -11 不适合,因此添加了最大的 unsigned long long + 1,并且 -11ULL 给出的结果比可能的最大 unsigned long long 值少 10。一个巨大的正数,而不是负数。
【讨论】:
unsigned int a=-1;
等同于:
unsigned int a=0xffffffff;
【讨论】: