标准C中移位或算术运算的扩展

标准C中移位或算术运算的扩展,c,c99,c11,C,C99,C11,对不起,英语不好 uint16_t a, c; uint8_t b = 0xff; a = b<<8; c = b*10; uint16\u t a,c; uint8_t b=0xff; a=b 通常的算术转换是在*的操作数上执行的。两个操作数都是整数类型,因此首先执行整数提升。由于10是一个int,并且b类型的所有值都可以表示为int,因此整数提升赋予两个操作数相同的类型,int,通常的算术转换不需要任何进一步的转换。乘法是在int类型下进行的,其结果2550,同样可以用c类型

对不起,英语不好

uint16_t a, c;
uint8_t b = 0xff;

a = b<<8;
c = b*10;
uint16\u t a,c;
uint8_t b=0xff;
a=b
通常的算术转换是在
*
的操作数上执行的。两个操作数都是整数类型,因此首先执行整数提升。由于
10
是一个
int
,并且
b
类型的所有值都可以表示为
int
,因此整数提升赋予两个操作数相同的类型,
int
,通常的算术转换不需要任何进一步的转换。乘法是在
int
类型下进行的,其结果
2550
,同样可以用
c
类型表示,因此在
c
中存储值之前进行的到
uint16\u t
的转换将保留该值

任意整数类型的情况是什么

uint16_t a, c;
uint8_t b = 0xff;

a = b<<8;

对于<代码>移位等于或大于,数据类型为UB。但我认为它不适用于这里,因为
b
首先将被提升为
int
(因此,根据标准,结果将是a=0xff00和b=2550)。@Mystical,也许你应该将该评论作为一个答案。确保扩展未定义行为的缩写。
c = b*10;