|
发表于 2023-1-23 14:04:43
|
显示全部楼层
陕西省西安市
我来说说我的见解,当然不一定对,只是猜测
unsigned long long 在32位和64位编译器中都是占八个字节 那么它的范围就是0~18446744073709551615UL
而你的数是16827111275793860813,很显然是在范围内的
16827111275793860813的二进制无符号在计算机中就是1110100110000101111010001000110100101101101010011100100000000000
对于无符号整数右移22位就是左边空出的位补零,右边移除的位丢弃。
结果是0000000000000000000000111010011000010111101000100011010010110110
也就是10进制的4011895960758,这时候我们在模2,答案很显然为0.
但是你说服务器返回的是1,那么说明服务器是以有符号整形来存储的,而long long的取值范围为-9223372036854775808L~9223372036854775807LL
很显然你的数并不在范围内,在c语言中有一个比较特殊的情况是当左移或右移移的位数超过该数值类型的最大位数时,编译器会用左移或右移的位数去模类型的最大位数,然后按余数进行移位
你右移22位很显然超过了最大位数,所有编译器用22模20得到余数2,所以16827111275793860813右移2位得到4206777818948465000
显然这个数模2答案是1
|
|