【问题标题】:Ada types size differenceAda 类型大小差异
【发布时间】:2014-03-01 20:53:08
【问题描述】:

我有这个 Ada 程序:

with Ada.Text_IO, Ada.Integer_Text_IO;
use Ada.Text_IO, Ada.Integer_Text_IO;
procedure test is
type MY_TYPE is new Integer range 1..20;
subtype MY_TYPE2 is MY_TYPE range 5..6;
c : MY_TYPE:=10;
 f : MY_TYPE2 :=6;
 begin
put(Integer(c'SIZE));
 end test;

当我运行它时,我得到 32。如果我替换

type MY_TYPE is new Integer range 1..20;

type MY_TYPE is range 1..20;

我得到 8。这两个声明有什么区别?

【问题讨论】:

    标签: size ada


    【解决方案1】:

    这个:

    type MY_TYPE is new Integer range 1..20;
    

    Integer 显式继承MY_TYPE,这在您的系统上显然是32 位。

    这个:

    type MY_TYPE is range 1..20;
    

    由编译器决定MY_TYPE继承什么如何表示MY_TYPE。结果是特定于实现的;显然您的编译器选择将其实现为 8 位整数类型。

    【讨论】:

    • 实际上,在第二种情况下,“MY_TYPE”并没有继承自任何东西。
    • @JacobSparreAndersen:你是对的。我在考虑 Ada 83 规则(已经有一段时间了)。
    【解决方案2】:

    您允许编译器为这些不同的类型声明选择大小,它会根据基本类型 (INTEGER) 的大小来选择您的 INTEGER 类型的大小。

    您可以控制这些类型的大小:如果您将第一个声明重写为

    type MY_TYPE is new Integer range 1..20;
    for MYTYPE'SIZE use 8;
    

    你应该得到一个 8 位的 MY_TYPE。

    for MYTYPE'SIZE use 5;
    

    应该将 MYTYPE 打包成 5 位(据我了解,允许编译器以显式错误拒绝它,或生成正确的代码,但不接受它并生成垃圾。)

    为什么要将MYTYPE 打包成 5 位?一个原因是,如果它被用作记录的一个组件:只要它们是布尔值并且它们的 SIZE 属性为 1,就可以在一个字节中为另外 3 个组件留出空间!

    这可能看起来像极端包装,但它实际上在嵌入式编程中很常见,其中记录类型与外围设备或 I/O 端口中的位相匹配。您还可以在记录中指定位级布局,如下所示:

    type Prescale is new Integer range 1..20;
    for  Prescale'SIZE use 5;
    
    type Timer_Ctrl_Reg is record
       Scale  : Prescale;
       Up     : Boolean;
       Repeat : Boolean;
       Int_En : Boolean;
    end record;
    for Timer_Ctrl_Reg use record
       Scale  at 0 range 0 .. 4;
       Up     at 0 range 5 .. 5;
       Repeat at 0 range 6 .. 6;
       Int_En at 0 range 7 .. 7;
    end record;
    

    at 以“存储单元”指定与记录库的偏移量,通常为字节或字:range 指定存储单元内的位位置。

    不再需要担心狡猾的位掩码和提取!

    另一方面,

    for MYTYPE'SIZE use 4;
    

    应该会失败,因为 MYTYPE 有超过 16 个离散值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      相关资源
      最近更新 更多