不能将超过 32 位的字符移位到 unsigned long long

Can't bitshift a char more than 32 bits into unsigned long long

我正在尝试将 char 值移位为 unsigned long long(或 uint64_t,或 __int64),每当我尝试对大于 32 的值进行移位时,它似乎从位移的大小中减去 32。

此处列出的其他重复问题不会立即说明 char 将仅升级为 int 而不是 unsigned long long。因为这对我来说并不明显,所以我不知道不将值移动比其大小更长的位的规则是相关的。

评论指出 char 只会变成 int,因此不能在赋值前升级为 64 位 int。

代码


#include <stdint.h>
#include <iostream>
#include <string>
#include <algorithm>


int main(...)
{

    std::string text = "Saturday 2019-08 August-31__08:46:32.38948-pm Pacific Daylight time-phoneid:xxxxxxxxxxx-xxxxxxxx";
    //unsigned int val1, val2, val3;
    //val1 = val2 = val3 = 0;

    //val1 = 't';
    //val1 = val1 << 24;
    //std::cout << val1 << std::endl;


    //unsigned long long hash[12];

    //uint8_t hash_count = 0;
    //uint8_t shift_offset = 7;
    //uint8_t hash_iter = 0;
    for (unsigned int ii = 0; ii < text.size(); ii+=8)
    {
        unsigned long long test_01 = text[ii] << 56   ;
        unsigned long long test_02 = text[ii+1] << 48 ;
        unsigned long long test_03 = text[ii+2] << 40 ;
        unsigned long long test_04 = text[ii+3] << 32 ;
        unsigned long long test_05 = text[ii+4] << 24 ;
        unsigned long long test_06 = text[ii+5] << 16 ;
        unsigned long long test_07 = text[ii+6] << 8  ;
        unsigned long long test_08 = text[ii+7] << 0;


        //hash_iter++;
    }


    return 0;
}

我怎么知道它不起作用?

我在 Visual Studio

中查看内存 window 中的值

系统

Windows 10 Visual Studio 2015 编译配置:调试,x64

text[ii] 是单个字符,将被提升为 int 以执行二进制操作。不可能比宽度移动更多一点。

您可以通过编译器警告轻松检测到它:Live

要解决这个问题,您可以简单地转换类型:

char a='a';
uint64_t x = (uint64_t)a<<45;