C++ Can';t位将超过32位的字符移位为无符号长字符

C++ Can';t位将超过32位的字符移位为无符号长字符,c++,visual-c++,bit-shift,C++,Visual C++,Bit Shift,我试图将字符值位移到无符号long-long(或uint64,或u_int64)中,每当我尝试按大于32的值进行位移时,它似乎会从位移的大小中减去32 此处列出的其他问题重复项不会立即说明char将仅升级为int,而不是无符号long。因为这对我来说并不明显,所以我不知道一个值不移位一点的规则与它的大小相关 评论指出,char只会变成int,因此不能在赋值之前升级到64位int 代码 #包括 #包括 #包括 #包括 int main(…) { std::string text=“2019年8月

我试图将字符值位移到无符号long-long(或uint64,或u_int64)中,每当我尝试按大于32的值进行位移时,它似乎会从位移的大小中减去32

此处列出的其他问题重复项不会立即说明
char
将仅升级为
int
,而不是
无符号long
。因为这对我来说并不明显,所以我不知道一个值不移位一点的规则与它的大小相关

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

代码
#包括
#包括
#包括
#包括
int main(…)
{
std::string text=“2019年8月31日星期六8:46:32.38948-pm太平洋夏令时电话号码:XXXXXXXXXX-xxxxxxxx”;
//无符号整数val1,val2,val3;
//val1=val2=val3=0;
//val1='t';

//val1=val1
text[ii]
是一个单独的字符,它将被提升为
int
以执行二进制操作。不能移动比宽度大一点的字符

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

要解决此问题,只需强制转换类型:

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

uint64_t x=(uint64_t)aE.g.
text[ii]
是单个
char
,可能有符号,也可能没有符号。如果要将其移位超过7位,则需要先将其转换为64位类型,如
静态转换(text[ii])
。记住,对变量
test\u 01
的赋值是在8位整数移位很多位之后完成的。
char
将被提升为int,并且由于在这种情况下
int
是32位类型,将其移位超过31会调用未定义的行为。
=/code>左侧的任何内容都不会调用影响右侧发生的事情。右侧没有无符号长字符。@Someprogrammerdude…我可以将
char
最多移动24位。@Andrew请阅读我评论的链接。
text[ii]
是一个字符,长度不长。显然,将其左移24位是可行的,因为这里的字符仅包含8位。您的示例代码编辑使这一问题成为一个相关答案,现在已被接受。谢谢you@Andrew在上一次编辑中,我共享了一个错误的链接。我正在检查编译器是否正确区分了临时文本的类型,但忘记了编辑类型:)
char a='a';
uint64_t x = (uint64_t)a<<45;