c++ - 不能将超过 32 位的 char 移位为 unsigned long long
问题描述
我正在尝试将 char 值位移为 unsigned long long (或 uint64_t 或 __int64),并且每当我尝试位移大于 32 的值时,它似乎会从位移的大小中减去 32。
此处列出的其他问题 a 重复项并未立即说明 achar
将升级为仅 anint
而不是unsigned long long
. 因为这对我来说并不明显,所以我不知道不将一个值移位的时间长于它的大小的规则是相关的。
评论指出char
only 成为 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
解决方案
text[ii]
是单个字符,将被提升为int
执行二进制操作。不可能移动比宽度多一点。
您可以通过编译器警告轻松检测到它:Live
要解决这个问题,您可以简单地转换类型:
char a='a';
uint64_t x = (uint64_t)a<<45;
推荐阅读
- javascript - 如何解决 Chrome 中的“一个不同的源子框架试图创建一个 JavaScript 对话框”警告?
- blazor-server-side - 多域 Blazor Web 应用程序
- javascript - 部分更新大对象的事件
- spring-boot - SpringBoot单元测试控制器mvc总是返回404
- python - settings.py 文件中的 Celery 配置
- spring - 即使在先前经过身份验证和授权成功之后,java spring + login 端点也不会被调用
- tensorflow - 如何设置多卡训练以及如何在tensorflow检测API中指定GPU训练
- networking - 计算 FDD LTE 中的最终用户吞吐量和下行链路?
- java - 选择复选框以编程方式选中android
- build - 如何在 AOSP A11 构建中将自己的启动器设置为默认值