相关疑难解决方法(0)

将大量类型转换为较小的类型

我已经好好看了一下,找不到类似的问题,如果之前被问过,请道歉.

我只是在玩类型和数字,我想知道是否可以保证以下行为.如果我将2个变量声明为

unsigned char BIT_8 = 0;
unsigned short int BIT_16 = 0xFF01;
Run Code Online (Sandbox Code Playgroud)

然后执行以下操作(暂时忽略C样式转换,除非这会影响它?)

cout << "BIT_16: " << BIT_16 << "\n";
cout << "BIT_8: " << (int)BIT_8 << "\n";
BIT_8 = BIT_16;
cout << "BIT_8 after: " << (int)BIT_8 << "\n";
BIT_8 = BIT_16 >> 8;
cout << "BIT_8 after shift: " << (int)BIT_8 << "\n";
Run Code Online (Sandbox Code Playgroud)

我得到了输出

BIT_16: 65281
BIT_8: 0
BIT_8 after: 1
BIT_8 after shift: 255
Run Code Online (Sandbox Code Playgroud)

是否保证如果我将16位类型转换为8位类型,则前导字节将丢失?或者它是不确定的,上面的结果是运气?

c++ types

18
推荐指数
1
解决办法
9037
查看次数

使用gcc进行逐位移位的意外行为

我有一个这样的测试程序:

int main()
{
    unsigned n = 32;

    printf("ans << 32 = 0x%X\n", (~0x0U) << 32);
    printf("ans >> 32 = 0x%X\n", (~0x0U) >> 32);

    printf("ans << n(32) = 0x%X\n", (~0x0U) << n);
    printf("ans >> n(32) = 0x%X\n", (~0x0U) >> n);

    return 0;
}  
Run Code Online (Sandbox Code Playgroud)

它产生以下输出:

ans << 32 = 0x0  ... (1)  
ans >> 32 = 0x0  ... (2)  
ans << n(32) = 0xFFFFFFFF  ... (3)  
ans >> n(32) = 0xFFFFFFFF  ... (4)   
Run Code Online (Sandbox Code Playgroud)

我期望(1)和(3)是相同的,以及(2)和(4)是相同的.

使用gcc版本:gcc.real(Ubuntu 4.4.1-4ubuntu9)4.4.1

怎么了?

c linux gcc bit-shift

3
推荐指数
1
解决办法
2085
查看次数

标签 统计

bit-shift ×1

c ×1

c++ ×1

gcc ×1

linux ×1

types ×1