我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.
在使用Visual Studio 2013的C++编译器时,我注意到我的代码依赖于size_t正确编译,甚至没有包含任何定义它的头(即#include <stddef.h>或#include <string.h>).
我测试了这个,因为我有点像不包括整个标题的想法只是为了那些微不足道的事情; 我觉得它膨胀了我的代码.我得出结论size_t,即使代码中没有任何头部包含,Visual Studio 2013的C++编译器也会自动定义.
在享受这一点的同时,我开始担心可移植性.编码方便,感觉像我的代码优雅,对我来说比绝对可移植性更重要; 但我还是喜欢一些便携性.例如,我不介意使用,#pragma once因为大多数编译器支持它并且标题保护是麻烦(特别是在Visual Studio中),但我绝不会因为一个编译器支持它而导致导出模板.
所以,我的问题是,size_t的自动定义是许多编译器提供的广泛特性,还是微软编译器特有的东西?
我需要从用户输入中获取数组大小.我把输入存储起来似乎很自然size_t,但是strto...()找不到任何合适的功能.我刚刚使用过strtoull(),因为unsigned long long保证至少64位,我还是使用C99.但我想知道什么是size_t从字符串中获取的最佳方法- 比如,在ANSI C中.
编辑:
为了澄清,我不希望字符串长度!例如,用户将以字符串的形式输入大缓冲区的大小"109302393029".我需要得到那个号码并存储为size_t.当然我可以使用strtol()甚至atoi(),但它看起来像一个笨拙的黑客(例如,size_t可能拥有更大的值int,我希望用户能够在可寻址空间中输入任何值).
是否存在任何已size_t定义为其他内容的实现unsigned int?在我工作的每个系统下,它被定义为unsigned int,所以我只是好奇.
我有这个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_t为rapidjson::SizeType,可能丢失数据
如何正确地从字符串的长度(size_t)转换为rapidjson SizeType?
我想向指针添加 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 添加到指针?结果地址将在地址“大小”中?
在MPI中发送size_t类型号码最安全的方法是什么?举例来说,我相信它是不是安全的,盲目地将它作为MPI_INT.MPI_LONG会一直有效吗?
我想进入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)
但我在标准中找不到任何关于无符号整数下溢的信息,所以我在这里瞎了.
可以sizeof(size_t)小于sizeof(int)?
C 和/或 C++ 标准是否保证unsigned int用于数组索引总是安全的?
我的印象size_t是unsigned int。但是我可以只写unsigned int而不是size_t在我的代码中吗?