首页 > 解决方案 > 不能将超过 32 位的 char 移位为 unsigned long long

问题描述

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

此处列出的其他问题 a 重复项并未立即说明 achar将升级为仅 anint而不是unsigned long long. 因为这对我来说并不明显,所以我不知道不将一个值移位的时间长于它的大小的规则是相关的。

评论指出charonly 成为 anint因此不能在分配前升级到 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 中内存窗口内的值

系统

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

标签: c++visual-c++bit-shift

解决方案


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

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

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

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

推荐阅读