8

是否有标准的 C/C++ 标头定义字节、千字节、兆字节,...?我不想自己定义。在我看来它很脏。

例子:

if (size > MEGABYTE)
{ ... }
4

4 回答 4

18

不,没有这样的标准定义。可能是因为附加值很小。

你经常会看到这样的事情:

#define KB(x)   ((size_t) (x) << 10)
#define MB(x)   ((size_t) (x) << 20)

这使用左移来表示操作x * 2 10x * 1,024 相同,对于 2 20也相同,即 1,024 * 1,024 即 1,048,576。这“利用”了千字节、兆字节等的经典定义在计算中使用二的幂的事实。

转换size_t为很好,因为这些是大小,我们希望它们可以很容易地用作 eg 的参数malloc()

使用上述内容,在代码中使用它们变得非常实用:

unsigned char big_buffer[MB(1)];

或 if( statbuf.st_size >= KB(8) ) { printf("文件为 8 KB (或更大)\n"); }

但是您当然可以只使用它们来进行进一步的定义:

#define MEGABYTE MB(1)
于 2013-04-16T07:49:06.913 回答
13

正如其他答案指出的那样,没有。C++11 中一个不错的解决方案是使用用户定义的文字:

constexpr std::size_t operator""_kB(unsigned long long v) {
  return 1024u * v;
}

std::size_t some_size = 15_kB;
于 2017-02-01T13:22:20.067 回答
2

那没有。但是为什么你不自己制作它们:

const unsigned long BYTE     = 1;
const unsigned long KILOBYTE = 1024;
const unsigned long MEGABYTE = 1024 * 1024;
const unsigned long GIGABYTE = 1024 * 1024 * 1024;

并且

const unsigned long long TERABYTE = 1024ULL * 1024 * 1024 *1024;

阅读更多...

于 2013-04-16T07:59:20.803 回答
1

并不是说它增加了很多,但我很喜欢这种形式:

#define KILOBYTES * 1024UL
#define MEGABYTES * 1048576
#define GIGABYTES * 1073741824UL

你可以像这样使用

    if (size > 10 MEGABYTES) { ...
于 2019-01-31T14:38:15.850 回答