在C语言中移位位值
假设我有以下代码:在C语言中移位位值,c,bit,unsigned,bit-shift,C,Bit,Unsigned,Bit Shift,假设我有以下代码: uint32_t fillThisNum(int16_t a, int16_t b, int16_t c){ uint32_t x = 0; uint16_t temp_a = 0, temp_b = 0, temp_c = 0; temp_a = a << 24; temp_b = b << 4; temp_c = c << 4; x = temp_a|tem
uint32_t fillThisNum(int16_t a, int16_t b, int16_t c){
uint32_t x = 0;
uint16_t temp_a = 0, temp_b = 0, temp_c = 0;
temp_a = a << 24;
temp_b = b << 4;
temp_c = c << 4;
x = temp_a|temp_b|temp_c;
return x;
}
uint32\u t fillThisNum(int16\u t a、int16\u t b、int16\u t c){
uint32_t x=0;
uint16温度a=0,温度b=0,温度c=0;
温度a=a
参数是否必须与函数类型的位长度相同,并且必须是无符号的
否,参数和返回值可以是不同的类型
我可以将无符号整数分配给有符号整数吗?(即uint32\u t a=int32\u t b;)
是的,该值将从有符号值转换为无符号值。“b”中的位将保持不变,因此当“b”在2的补码中时,“a”将是一个32位的正数
例如,让int8_t c=-127。如果执行赋值uint8_t d=c,那么“d”将是129
我可以用16位参数填充32位数字,只要它们不超过32位返回值的长度
如果这样说,您的意思是您在代码中所采用的方式:
x = temp_a|temp_b|temp_c;
是的,这很好,@chux提到了一个警告:您不能将一个n位值移到n位以上。如果您想在x中设置比15位更重要的位,一种方法是将一个临时掩码设置为32位值而不是16位值。编写此代码的正确方法是:
uint32_t fillThisNum(uint32_t a, uint32_t b, uint32_t c)
{
// mask out the bits we are not interested in
a &= 0xFFFFFF; // save lowest 24 bits
b &= 0xF; // save lowest 4 bits
c &= 0xF; // save lowest 4 bits
// arrange a,b,c within a 32-bit unit so that they do not overlap
return (a << 8) + (b << 4) + c;
}
uint32\u t fillThisNum(uint32\u t a、uint32\u t b、uint32\u t c)
{
//掩盖我们不感兴趣的部分
a&=0xFFFFFF;//保存最低24位
b&=0xF;//保存最低4位
c&=0xF;//保存最低4位
//在32位单元内排列a、b、c,使它们不会重叠
return(注意:如果int
位大小为16,temp_a=a通常更好地使用无符号类型与有符号类型进行移位。当您说“参数是否必须与函数类型具有相同的位长度…”时,请使用“函数类型”,你的意思是函数返回值的类型吗?@plafratt是的,如果返回类型是uint32\u t,那么参数是否也必须是uint32\u t类型。你能描述一下32位结果的哪些位应该来自何处吗?你的实际代码只填充(最多)x
的低16位,因为所有temp
s都是16位,并且它与c
重叠b
。代码int8\u t c=0x81;
可以给c
任何值或发出信号(必须由编译器文档描述)。这是实现定义的行为。这很有趣。这是基于C规范的吗?如果是,请提供一个参考?我可以改为说uint8_t C=-127吗?是的,C99 6.3.1.3/3。uint8_t C=-127;
定义良好,并且包含在6.3.1.3/2中。好的,谢谢。我不知道。我想编译器也是这样做的在所有情况下,对两种文字都使用了ing。我希望了解一下标准。在C11中,它是相同的编号和文本。请注意,0x81
是一种类型为int
和value129
的文字。非常好但简单的解释。Matt需要一个正确方向的线索,这很有帮助。我可以将此逻辑应用到更复杂的领域现在是x问题,谢谢!正如我在回答中提到的,如果需要发送16位参数,可以这样做,然后将它们移动到32位临时值,以在返回值中设置适当的位。