C语言中的软件暴露位宽度

C语言中的软件暴露位宽度,c,bit,cpu-registers,C,Bit,Cpu Registers,我有两个问题: 有没有什么方法可以指定或限制C程序中整数变量的位宽度 有没有办法监控C程序中变量的实际位使用情况?我所说的位使用是指,在某些程序中,当一个寄存器分配给一个变量时,并不是该寄存器的所有位都用于计算。因此,当一个程序被执行时,我们能监控一个寄存器中有多少位在整个程序执行过程中实际发生了变化吗 如果您使用,您的控制权有限 在大多数系统上,它将提供: int8\u t和uint8\u t用于8位整数 int16\u t和uint16\u t用于16位整数 int32\u t和uint3

我有两个问题:

  • 有没有什么方法可以指定或限制C程序中整数变量的位宽度
  • 有没有办法监控C程序中变量的实际位使用情况?我所说的位使用是指,在某些程序中,当一个寄存器分配给一个变量时,并不是该寄存器的所有位都用于计算。因此,当一个程序被执行时,我们能监控一个寄存器中有多少位在整个程序执行过程中实际发生了变化吗

  • 如果您使用
    ,您的控制权有限

    在大多数系统上,它将提供:

    • int8\u t
      uint8\u t
      用于8位整数
    • int16\u t
      uint16\u t
      用于16位整数
    • int32\u t
      uint32\u t
      用于32位整数
    • int64\u t
      uint64\u t
      用于64位整数
    你通常没有其他选择。但是,您可以使用位字段获得更任意的大小值:

    typedef struct int24_t
    {
        signed int b24:24;
    } int24_t;
    
    这可能会占用超过24位(可能是32位),但算术结果将是24位。您不受2的幂的限制,甚至不受2的倍数的限制:

    typedef struct int13_t
    {
        signed int b13:13;
    } int13_t;
    
    从1999年的标准开始,您可以在C中使用固定宽度(或保证至少有这么多位)类型,例如,请参见
    inttypes.h
    C标题(在C++中称为
    cinttypes
    )中定义的任何合适的C描述,也可以在
    stdint.h
    (C)或
    cstdint
    (C++)中使用


    您当然可以检查每次计算的值,并相应地限制变量。但除非你真的被空间限制住了,否则我就忘了这件事。在许多情况下,使用“刚好足够大”的数据类型会浪费空间(和计算时间),因为必须将较小的值转换为自然宽度进行计算,然后再进行回溯。小心,甚至更多地优化错误的代码(在深入研究使代码“更好”之前,先衡量性能是否足够,如果不够,哪些地方值得修改)。

    对于1,是的。看,所有的位都用在计算中,你是什么意思?您无法在运行中撤消处理器的接线…1)是的,请使用和。2) 您无法从C监视寄存器…@dwelch他说的是某些x86指令只影响寄存器的一部分的能力。AL,啊,AX,EAX都使用相同的寄存器,但前三个只使用它的一部分。这在汇编语言程序中是有好处的,但在C程序中不是。@user3386109是的,你是对的,我正试图构建一个编译器,利用这一特性,以最佳方式将C程序翻译成汇编指令。有没有处理器或硬件平台在不使用时会关闭总线片?