if语句可以评估标准化的最大变量二进制宽度吗?

时间:2016-02-23 03:35:57

标签: c++ if-statement

if语句可以评估特定于实现的最大变量宽度。或者编译器可以强制将变量强制转换为另一个类型,例如boolean,以便通过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.

2 个答案:

答案 0 :(得分:1)

if(X)的定义是,它的行为就好像这个定义创建了一个临时文件:

bool temp(X);

然后iff temptrue,测试成功。如果该声明形成不良,那么if - 声明就是格式错误。

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

(很明显,您的问题的答案是任何可以转换为bool的类型都可以通过if语句进行评估。

NB。您问题中的(~0) << (8 - 1);等会导致未定义的行为。非正式地,将1左移到符号位是未定义的(这意味着负数的所有左移都是未定义的)。

此外,如果您有32位整数,(~0) << (64 - 1);会导致UB由于大于该类型的宽度而移位。

要避免这种情况,请先使用1ULL代替~0,或执行uint64_t x = INT64_MIN;之类的操作。 (使用后一种方法,您可以使用模板通过std::numeric_limits)找到值。

答案 1 :(得分:0)

C ++标准(C ++ 11)定义了多达64位的整数类型:

http://en.cppreference.com/w/cpp/types/integer

但是,某些实现最多可以达到128位。

https://msdn.microsoft.com/en-us/library/cc953fe1.aspx

据推测,一个特定的实现可以定义自己的扩展,以便任意大。

因此,如果您想坚持使用可移植的C ++标准类型,请坚持使用C ++规范中定义的64位及更低版本。如果本机大小较小,则标准编译器将通过组合较小的本机字来提供实现以支持较大的大小(可能性能损失)。 (例如,在32位平台上从2个32位字创建64位整数。)

如果你真的想问一下&#34;我怎样才能找到我平台上最大的原生尺寸?&#34;这是一个不同的问题。