相关疑难解决方法(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
查看次数

位移导致奇怪的类型转换

以下代码编译时没有警告:

std::uint16_t a = 12;
std::uint16_t b = a & 0x003f;
Run Code Online (Sandbox Code Playgroud)

但是,与按位一起执行位移会导致“隐式转换警告”:

std::uint16_t b = (a & 0x003f) << 10; // Warning generated.
Run Code Online (Sandbox Code Playgroud)

gcc 和 clang 都抱怨有从intto的隐式转换uint16_t,但我不明白为什么引入位移会导致右手表达式突然计算为 an int

编辑:对于clang,我用-std=c++14 -Weverything标志编译;对于 gcc,我用-std=c++14 -Wall -Wconversion标志编译。

c++ bit-shift type-conversion

6
推荐指数
2
解决办法
1647
查看次数

标签 统计

c++ ×2

bit-shift ×1

type-conversion ×1

types ×1