在"uint8_t | (uint8_t << 8)"中是否有处理整数提升的不同方式?
Is there a different way integer promotion will be handle in "uint8_t | (uint8_t << 8)"?
在下面的程序中,似乎a[1]被移位了八位,然后变为0,打印值应该是1。但实际上发生了整数提升,b的打印值为257。我正在x86-64上运行gcc版本4.8.2。
问题是:如果不通过更改处理器和编译器(处理器选项仅限于x86、x86-64和所有ARM)来更改代码,是否会以不同的方式处理整数提升,从而使打印值不是257?
#include<stdio.h>
#include<stdint.h>
#include<inttypes.h>
int main(){
uint8_t *a;
a = (uint8_t *)malloc(sizeof(uint8_t)*2);
uint16_t b;
a[0] = 1; a[1] = 1;
b = a[0] | (a[1] << 8);
printf("b = %dn", b);
return 0;
}
整数提升是否会以不同的方式处理,从而使打印值不是257?
没有。整数提升总是发生,这意味着a[0]
和a[1]
在移位或按位or发生之前都被提升为int
。
来自规格:
如果
int
可以表示原始类型的所有值(受比特字段宽度的限制),则该值将转换为int
。。。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 从值小于256的uint16到uint8的Endian安全转换
- 你能把一个向量<int64>投射到一个向量<uint8>吗
- SSCANF 进入 uint8 阵列失败
- 着色器将uint8投射到float,并将其重新解释回uint
- 如何显式调用运算符<<
- 将指针uint8覆盖到指针uint16
- 创建一个包含30亿个uint8元素的向量
- 将 Uint8(浮点AUDIO_F32)转换为int16_t(16 位 PCM)
- UINT8/16 /32/etc 和 INT8/16/32/etc 在 libtiff 中不起作用?
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- 将具有不同字段的结构转换为 uint8 的数组
- uint32, int16, uint8 .为什么这些常用的数据类型没有进入标准