Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是静态_cast<;T>;(-1)生成无数字限制的所有一位数据的正确方法? 我在一个环境中编写C++代码,在这个环境中我不能访问C++标准库,尤其是不要 STD::NoimICIOLL> 。假设我想要实现 template <typename T> constexpr T all_ones( /* ... */ ) template constr T all_one(/*…*/)_C++_Bit Manipulation_Idioms - Fatal编程技术网

是静态_cast<;T>;(-1)生成无数字限制的所有一位数据的正确方法? 我在一个环境中编写C++代码,在这个环境中我不能访问C++标准库,尤其是不要 STD::NoimICIOLL> 。假设我想要实现 template <typename T> constexpr T all_ones( /* ... */ ) template constr T all_one(/*…*/)

是静态_cast<;T>;(-1)生成无数字限制的所有一位数据的正确方法? 我在一个环境中编写C++代码,在这个环境中我不能访问C++标准库,尤其是不要 STD::NoimICIOLL> 。假设我想要实现 template <typename T> constexpr T all_ones( /* ... */ ) template constr T all_one(/*…*/),c++,bit-manipulation,idioms,C++,Bit Manipulation,Idioms,专注于无符号整数类型,我应该放在那里什么?具体来说,static\u cast(-1)是否足够好?(其他类型我可以根据大小将其视为无符号字符数组。)在0上使用按位NOT运算符~ T allOnes = ~(T)0; 一个静态\u cast(-1)采用两个的补码,这是不可移植的。如果您只关心未签名的类型,那么这是一种方法 工作示例: 专注于无符号整数类型,我应该放在那里什么?具体来说,静态_cast(-1)是否足够好 如果你只关心无符号类型,是的,转换 -1 < /代码>对于所有标准C++实现都

专注于无符号整数类型,我应该放在那里什么?具体来说,
static\u cast(-1)
是否足够好?(其他类型我可以根据大小将其视为无符号字符数组。)

0
上使用
按位NOT
运算符
~

T allOnes = ~(T)0;
一个
静态\u cast(-1)
采用两个的补码,这是不可移植的。如果您只关心未签名的类型,那么这是一种方法

工作示例:

专注于无符号整数类型,我应该放在那里什么?具体来说,静态_cast(-1)是否足够好


如果你只关心无符号类型,是的,转换<代码> -1 < /代码>对于所有标准C++实现都是正确的。对无符号类型的操作,包括将有符号类型转换为无符号类型,保证按模(max+1)工作。

这是一种非常直接的方式

T allOnes;
memset(&allOnes, ~0, sizeof(T));
专注于无符号整数类型,我应该放在那里什么? 具体来说,静态_cast(-1)是否足够好

是的,足够好了

但我更喜欢十六进制值,因为我的背景是嵌入式系统,而且我必须知道sizeof(T)

即使在桌面系统中,我们也知道以下T的大小:

uint8_t  allones8  = 0xff;
uint16_t allones16 = 0xffff;
uint32_t allones32 = 0xffffffff;
uint64_t allones64 = 0xffffffffffffffff;
另一种方法是

static_cast<T>(-1ull)


正确的是,2的补码并不是到处都用,依赖它的代码也不是可移植的,但绝大多数系统都使用它。如果
T
short
,那么
~(short)0
首先提升
(short)0
返回int。然后,您得到的值可能超出
short
的范围,从而导致转换,其结果由实现定义,不需要全部为位1。(这是不可能的两个的补充,但你的答案特别试图解决移植到其他系统。)@hvd为什么要推广短?“是否不能保证global~操作符有一个简短的实现?”Andreas提出了一个好问题。这是因为整型提升是从C继承而来的。C是由dmr设计的,便于编译器编写人员编写,因此所有可以表示为
int
,如果不能表示为
signed int
,则提升为int,它被提升为一个
无符号int
。这种方法的另一个优点是它具有表达能力。你想要全1,这是全0的对立面。阅读它的人知道它的功能。“负一补”的方法并不是表达性的,而是依赖于实现知识。“所有标准的C++实现”——谈论一个令人困惑的标签。这是由“标准”指定的,还是它是“实现”的——定义为与C++的其他标准一样?无符号类型需要完全溢出。它不适用于签名类型,未定义签名溢出。我的答案是“实现定义”或“实现定义”或“实现定义”或“实现定义”,但我们可以假设任何正常的实现都能实现您期望的功能。@下划线\d我的解决方案不依赖于它,hvd的解决方案也不依赖于它。@Leandros是的,nvm,模是这里的关键。@下划线\d正是。。)我认为语言标准没有规定2的补码,所以可能使用
~0
而不是
-1
。。。哦,已经有一个答案确切地(或或多或少地)说明了我的想法……所以你也不能访问
?因为否则,你可以很容易地自己实现类似于
std::numeric\u limits
的东西。@ChristianHackl:不确定。但是,使用limits.h,我至少可以对所有数字类型进行显式专门化。模板多态性与2。非整数类型是问题的第二部分,所以我想说不是完全重复。@Leandros和Omni,如何/何时对问题进行别名处理?@Andreas正在考虑,从来没有。这只对8位字节有效。我想初始化一个constexpr表达式,而不是在运行时设置一个值。@einpoklum,要求它至少为8。虽然8位字节已成为业界的主流,但其他大小的字节仍能满足要求;至少,非8位字节更有可能满足非2的补码负数。不过,只要使用
~0
而不是
0xFF
,这个问题很容易解决。使用相同字符数的解决方案如何“更简洁”?
static_cast<T>(~0ull)