C++ 是否存在if语句可以计算的标准化最大变量二进制宽度?

C++ 是否存在if语句可以计算的标准化最大变量二进制宽度?,c++,if-statement,C++,If Statement,是if语句可以计算特定于实现的最大变量宽度。或者,编译器可以强制将变量强制转换为另一种类型,例如由if语句计算的布尔值。请考虑下面的代码,以及我的机器上的输出。我这样问是因为我想可靠地分发一个库,用于许多不同的机器上,包括arm、mips、amd86、x86等。请注意,我了解本机整数类型并不总是达到64/32/16位宽度 此外,如果它被定义,那么它究竟是如何定义的 代码: #include <iostream> #include <cstdint> #include &l

是if语句可以计算特定于实现的最大变量宽度。或者,编译器可以强制将变量强制转换为另一种类型,例如由if语句计算的布尔值。请考虑下面的代码,以及我的机器上的输出。我这样问是因为我想可靠地分发一个库,用于许多不同的机器上,包括arm、mips、amd86、x86等。请注意,我了解本机整数类型并不总是达到64/32/16位宽度

此外,如果它被定义,那么它究竟是如何定义的

代码:

#include <iostream>
#include <cstdint>
#include <bitset>
int main() {

// Initialises variables with a single binary 1 in the left most place.
uint8_t eight_bit = (~0) << (8 - 1);
uint16_t sixteen_bit = (~0) << (16 - 1);
uint32_t thirty_two_bit = (~0) << (32 - 1);
uint64_t sixty_four_bit = (~0) << (64 - 1);


std::cout << "The 8 bit integer is equal to: " 
    << std::bitset<8>(eight_bit) << "\n";
std::cout << "The 16 bit integer is equal to: " 
    << std::bitset<16>(sixteen_bit) << "\n";
std::cout << "The 32 bit integer is equal to: " 
    << std::bitset<32>(thirty_two_bit) << "\n";
std::cout << "The 64 bit integer is equal to: " 
    << std::bitset<64>(sixty_four_bit) << "\n";


if (eight_bit)      
    std::cout << "8 bit variable considered true." << "\n";

if (sixteen_bit)    
    std::cout << "16 bit variable considered true." << "\n";

if (thirty_two_bit) 
    std::cout << "32 bit variable considered true." << "\n";

if (sixty_four_bit) 
    std::cout << "64 bit variable considered true." << "\n";

return 0;
}
The 8 bit integer is equal to: 10000000
The 16 bit integer is equal to: 1000000000000000
The 32 bit integer is equal to: 10000000000000000000000000000000
The 64 bit integer is equal to: 1000000000000000000000000000000000000000000000000000000000000000
8 bit variable considered true.
16 bit variable considered true.
32 bit variable considered true.
64 bit variable considered true.

C++标准(C++ 11)定义了64位积分类型:

然而,有些实现可以达到128位

大概一个特定的实现可以定义自己的扩展,使其任意大

这样,如果你想坚持使用可移植的C++标准类型,那么就要坚持C++规范中定义的64位和以下。如果本地大小较小,标准编译器将提供支持以较小的本地词组合来支持更大的尺寸(可能在性能上受到惩罚)。(例如,在32位平台上从2个32位字创建64位整数。)

如果您真的想问“如何在我的平台上找到最大的本机大小?”这是一个不同的问题。

如果(X),则
的定义是,它的行为就像此定义创建了一个临时大小:

bool temp(X);
如果
temp
true
,则测试成功。如果该声明的格式不正确,则
If
-语句的格式不正确

从整数类型到
bool
的转换定义为零表示
false
,其他所有表示
true

(明确地说,您的问题的答案是,任何隐式转换为
bool
的类型都可以通过
if
语句进行计算)



注意<代码>(~0)你有一大堆未定义的行为,有移位。我也不确定我是否理解这个问题。if()语句可以计算任何计算结果为bool的表达式。任何数值类型通过与0的比较计算为bool,因此if语句将支持目标实现支持的任何整数类型。然后我们来看看指针,在bool上下文中,指针也与0相比较。然后我们来到一个任意类,如果它有一个合适的布尔运算符。if语句非常通用,你不同意吗?
~0
不等于
1
。如果您对编写可移植代码感兴趣,只需使用
1@bruffalobill,了解哪些班次是可移植的是一个好的开始。(这些不是)@M.M:你说得对,我错过了另一个必要的后缀。您需要
U
,因为向左移动负值是直接的,但您仍然必须遵守其他规则。将LL添加到给定的
(~0ULL)