不能将超过 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;
我正在尝试将 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;