当前位置: 首页 > 知识库问答 >
问题:

为什么sizeof()返回4字节而不是2字节的短int?[副本]

夏侯朝斑
2023-03-14

使用sizeof()打印变量的大小

#include <stdio.h>

main()
{
    int a = 10,b = 20; 
    short int c;
    short int d = sizeof(c = a+b);
    int e = sizeof(c*d); //e holds the value of 4 rather than 2
    double f = sizeof(e*f);
    printf("d:%d\ne:%d\nf:%lf\n",d,e,f);
}

为什么sizeof()返回int的大小,而不是短int,即2个字节?

共有1个答案

公西俊才
2023-03-14

声明

sizeof(c = a+b);

不测量变量c的大小,而是从表达式c=a b计算的值的大小。分配给c的是a b的值,但它也是整个表达式的值。

算术表达式中出现的存储类型小于int的整数值将升级为int(或无符号int)。算术表达式结果的存储类型为int。这不受存储在短int变量中的事实的影响。因此,由sizeof()返回的值。

sizeof(c*d)也是如此。

 类似资料:
  • C 中的 Integer 变量是占用 2 个字节还是 4 个字节?它所依赖的因素是什么? 大部分教材都说整型变量占用2个字节。但是当我运行一个程序,打印一个整数数组的连续地址时,它显示了4的差异。

  • 问题内容: 在Java中,如果将s,s或s相除,则总会得到一个。如果操作数之一是,我们将得到。 我的问题是-为什么或除法不会导致或?为什么总是? 显然,我不是在寻找“因为JLS这样说”的答案,而是在询问Java语言中此设计决策的技术原理。 考虑以下代码示例: 除以一个字节就不能了,可以吗? 那么为什么一定是一个?为什么不能有? 为什么必须如此,结果总是合适的,不是吗? 更新资料 正如@Eran所指

  • 我认为的意思是不能大于8位的容量。0B1111_1111是8位。

  • 问题内容: 为什么不: 代替: 获得唯一哈希码的更高机会? 问题答案: 因为数组的最大长度为。 由于的主要用途是确定将对象插入/ 的后备数组中的哪个插槽,因此hashcode> 将无法存储在该数组中。

  • 考虑以下代码: 这会产生编译错误,因为添加2字节的结果是Int。 为了解决这个问题,我需要手动将结果转换回字节: 这是非常反直觉的。为什么算术运算符是这样工作的?

  • 问题内容: 我需要将缓冲区的长度存储在4个字节大的字节数组中。 伪代码: 做到这一点的最佳方法是什么?请记住,稍后我必须将该字节数组转换回整数。 问题答案: 您可以使用以下方式将其转换为字节: 注意,这样做时可能必须考虑字节顺序。