我有一个字符串:
"quic"
传递给一个函数,其中构成字符串的位存储在无符号的__int64中.导致以下输出:
0111010001101000011001010010000001110001011101010110100101100011
但是,当我传递包含这些值的字符串时:
0xDE,0x10,0x9C,0x58,0xE8,0xA4,0xA6,0x30,'\ 0'
输出不如我预期的那样正确:
1111111111111111111111111111111111111111111111111010011000110000
我使用与第一个字符串相同的代码,其中包含:
(((unsigned __int64)Message [0])<< 56)| (((unsigned __int64)Message [1])<< 48)|
(((unsigned __int64)消息[2])<< 40)| (((unsigned __int64)Message [3])<< 32)|
(((unsigned __int64)Message [4])<< 24)| (((unsigned __int64)Message [5])<< 16)|
(((unsigned __int64)Message [6])<< 8)| (((unsigned __int64)Message [7]));
我猜你做了这样的事,
char a[] = {0xDE, 0x10, 0x9C, 0x58, 0xE8, 0xA4, 0xA6, 0x30};
Run Code Online (Sandbox Code Playgroud)
将它更改为unsigned char将解决您的问题,
unsigned char a[] = {0xDE, 0x10, 0x9C, 0x58, 0xE8, 0xA4, 0xA6, 0x30};
Run Code Online (Sandbox Code Playgroud)
我已经尝试过两者,在VC++中char版本会出错,但是无符号版本是正确的.
如果你想知道原因,请看一个更简单的版本,
char a = 0xDE;
unsigned char b = 0xDE;
Run Code Online (Sandbox Code Playgroud)
有什么不同?0xDE是一个int类型.对于第一个,您将int转换为signed char,对于第二个,您将int转换为unsigned char.
从标准4.7/2,4.7/3
如果目标类型已签名,则如果可以在目标类型(和位字段宽度)中表示该值,则该值不会更改; 否则,该值是实现定义的.
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2n,其中n是用于表示无符号类型的位数).[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断). - 尾注]
| 归档时间: |
|
| 查看次数: |
257 次 |
| 最近记录: |