为什么 sizeof(0xF) 是 4 个字节?

萨贾德克

我有以下代码,

unsigned short code = 0x12E0;
code = code & 0x0FFF;

在我的 CLion IDE 中,我收到一条警告

“类型的值int可能不适合接收器类型unsigned short

如果我这样说code &= 0x0FFF;,警告就消失了。

为什么它是0x0FFF作为intsizeof(0xF)4,有人可以解释为什么?

伦丁

整数常量0x0FFF与所有整数常量一样,至少是 类型int但是这里没有关系。

在表达式中code & 0x0FFF,操作数code0x0FFF都服从隐式整数提升,整数提升规则这适用于小整数类型,例如short. 因此,无论其他操作数的类型如何,code操作数总是被提升为(至少)int

因此,如果您这样做,您将遇到同样的问题:

unsigned short code = 0x12E0;
unsigned short x = 0x0FFF;
code = code & x;

编译器可能会抑制前两行中的警告,因为它只是简单的赋值。但在最后一行有一个更复杂的表达式,整数溢出可能是一个问题。总的来说,编译器往往与这些类型的警告不一致,因为它们不是强制性的。

迂腐但 100% 安全的代码,没有隐式类型转换,看起来像这样:

code = (unsigned short) ((unsigned int)code & 0x0FFFu);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在Turbo C编译器中sizeof(int)是2个字节,而在gcc Linux编译器中是4个字节?

为什么 QList 对象的大小是 4 个字节?

为什么打包的struct的大小是5个字节而不是4个字节?

为什么 char* 需要 4 个字节而不是 1 个字节

为什么vtable具有sizeof(void *)* 2个字节的0x00填充?

为什么arr [0]的大小是8个字节?

sizeof(2147483648)是8个字节,而sizeof(2147483647 + 1)是4个字节

为什么qsort恰好需要4个字节来对字符串文字进行排序?

为什么gdb告诉我x86-64上的指针是4个字节?

为什么我的Short在VB.net中包含4个字节

为什么结构的底层长度会增加到4个字节?

为什么int8_t的输出格式使用4个字节?

为什么在64位平台上BSTR长度前缀为4个字节?

为什么在C语言的4个字节上出现一个char字符

为什么字符缓冲区内容大小是 4 个字节?

即使我在联合中使用指针,为什么联合的 sizeof 不是 8 字节而是 4 字节?

为什么“ sizeof(a?true:false)”给出四个字节的输出?

为什么 sizeof(a ? true : false, a) 运算符打印一个字节?

为什么 sizeof() 不打印 16 个字节而不是 8 个?

ResponseError:预期为4或0个字节的int

为什么堆栈帧中局部变量数组的每个插槽都是4个字节,而不是JVM中的1个字节?

为什么JVM tableswitch / lookupswitch指令的格式具有0到3个字节的填充?

为什么sizeof(!0)打印1而不是4?

为什么要fread(fmtChunkId,sizeof(char),4,fp); 读了11个字符?

为什么我们需要1,2,4,8个字节将逻辑变量存储在fortran中?

为什么打印char有时会在C中打印4个字节的数字

为什么python的serial.read、serial.read_until在4个字节后返回垃圾?

sizeof(int)是4个字节,但只写入了两个

当MACRO不保存任何内存位置时,为什么sizeof(MACRO)给出4字节的输出?