标签: size-t

size_t 0x1 << 31远大于size_t 0x1 << 30

size_t注意到的一些行为使我感到困惑:

size_t zero = 0x1 << 32;
size_t big = 0x1 << 31;
size_t not_as_big = 0x1 << 30;
printf("0x1<<32: %zx\n0x1<<31: %zx\n0x1<<30: %zx\n", zero, big, not_as_big);
Run Code Online (Sandbox Code Playgroud)

结果是:

0x1<<32: 0
0x1<<31: ffffffff80000000
0x1<<30: 40000000
Run Code Online (Sandbox Code Playgroud)

现在,我明白size_t只保证至少是一个16位无符号整数,但我不明白为什么会0x1<<31结束它所做的值 - 尝试分配18 exabytes在我的程序上做了一个数字.

我在x86_64上使用LLVM.

c size-t

4
推荐指数
2
解决办法
466
查看次数

哪些C++编译器自动定义size_t而不需要包含头?

在使用Visual Studio 2013的C++编译器时,我注意到我的代码依赖于size_t正确编译,甚至没有包含任何定义它的头(即#include <stddef.h>#include <string.h>).

我测试了这个,因为我有点像不包括整个标题的想法只是为了那些微不足道的事情; 我觉得它膨胀了我的代码.我得出结论size_t,即使代码中没有任何头部包含,Visual Studio 2013的C++编译器也会自动定义.

在享受这一点的同时,我开始担心可移植性.编码方便,感觉像我的代码优雅,对我来说比绝对可移植性更重要; 但我还是喜欢一些便携性.例如,我不介意使用,#pragma once因为大多数编译器支持它并且标题保护是麻烦(特别是在Visual Studio中),但我绝不会因为一个编译器支持它而导致导出模板.

所以,我的问题是,size_t的自动定义是许多编译器提供的广泛特性,还是微软编译器特有的东西?

c++ size-t visual-studio-2013

4
推荐指数
1
解决办法
563
查看次数

如何从字符串中获取size_t?

我需要从用户输入中获取数组大小.我把输入存储起来似乎很自然size_t,但是strto...()找不到任何合适的功能.我刚刚使用过strtoull(),因为unsigned long long保证至少64位,我还是使用C99.但我想知道什么是size_t从字符串中获取的最佳方法- 比如,在ANSI C中.

编辑:

为了澄清,我不希望字符串长度!例如,用户将以字符串的形式输入大缓冲区的大小"109302393029".我需要得到那个号码并存储为size_t.当然我可以使用strtol()甚至atoi(),但它看起来像一个笨拙的黑客(例如,size_t可能拥有更大的值int,我希望用户能够在可寻址空间中输入任何值).

c string size-t

4
推荐指数
2
解决办法
6083
查看次数

size_t总是unsigned int

是否存在任何已size_t定义为其他内容的实现unsigned int?在我工作的每个系统下,它被定义为unsigned int,所以我只是好奇.

c++ size-t

4
推荐指数
2
解决办法
1748
查看次数

从'size_t'转换为'rapidjson :: SizeType'

我有这个c ++示例代码:

void test()
{
    rapidjson::Document doc;
    doc.SetObject();

    const std::string source = "The quick brown fox jumps over the lazy dog";   
    rapidjson::Value source_val;
    source_val.SetString( source.c_str(), source.length(), doc.GetAllocator() );        
}
Run Code Online (Sandbox Code Playgroud)

在编译时,在x64平台上,我收到此警告:

警告C4267:'参数':转换size_trapidjson::SizeType,可能丢失数据

如何正确地从字符串的长度(size_t)转换为rapidjson SizeType?

c++ size-t type-conversion c++11 rapidjson

4
推荐指数
1
解决办法
535
查看次数

将 size_t 变量添加到指针

我想向指针添加 size_t 类型。有些像这样:

void function(size_t sizeA,size_t sizeB){
    void *pointer;
    pointer=malloc(sizeA);
    pointer=pointer+sizeB;
}
Run Code Online (Sandbox Code Playgroud)

在假设的情况下,这不会以段错误结束,问题是:我可以这样做吗?将类型 size_t 添加到指针?结果地址将在地址“大小”中?

c pointers size-t addition

4
推荐指数
1
解决办法
8264
查看次数

使用MPI发送size_t类型数据

在MPI中发送size_t类型号码最安全的方法是什么?举例来说,我相信它是不是安全的,盲目地将它作为MPI_INT.MPI_LONG会一直有效吗?

c size-t mpi

4
推荐指数
1
解决办法
1226
查看次数

如何在C89中获得SIZE_MAX

我想进入SIZE_MAXC89.

我想到了以下方法SIZE_MAX:

const size_t SIZE_MAX = -1;
Run Code Online (Sandbox Code Playgroud)

由于标准(§6.2.1.2ANSIC)说:

当有符号整数转换为具有相等或更大大小的无符号整数时,如果有符号整数的值为非负,则其值不变.否则:如果无符号整数的大小更大,则有符号整数首先被提升为与无符号整数对应的有符号整数; 通过向该值添加一个大于可以在无符号整数类型 28中表示的最大数字的值,将该值转换为无符号

脚注28:

在二进制补码表示中,如果无符号整数具有更大的大小,则除了用符号位的副本填充高位以外,位模式中没有实际的变化.

这似乎已经定义了行为,但我不太确定我是否正确理解了该段落的措辞.

请注意,这个问题明确是关于C89的,所以不能回答我的问题,因为标准有不同的措辞.

如果这不起作用,我提出的另一种方式是:

size_t get_size_max() {
    static size_t max = 0;
    if (max == 0) {
        max -= 1U;
    }

    return max;
}
Run Code Online (Sandbox Code Playgroud)

但我在标准中找不到任何关于无符号整数下溢的信息,所以我在这里瞎了.

c size-t c89

4
推荐指数
1
解决办法
1784
查看次数

sizeof(size_t) 可以小于 sizeof(int) 吗?

可以sizeof(size_t)小于sizeof(int)

C 和/或 C++ 标准是否保证unsigned int用于数组索引总是安全的?

c c++ sizeof size-t language-lawyer

4
推荐指数
1
解决办法
430
查看次数

我可以只使用 unsigned int 而不是 size_t 吗?

我的印象size_tunsigned int。但是我可以只写unsigned int而不是size_t在我的代码中吗?

c unsigned size-t

4
推荐指数
2
解决办法
148
查看次数