如何确定C中保留标识符的数据类型

时间:2018-01-29 23:36:38

标签: c bitwise-operators reserved-words

我在使用C中的一些高级概念时相当新。我正在尝试理解使用<Grid> <Grid.RowDefinitions> <RowDefinition Height="50"/> ... </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="50"/> ... </Grid.ColumnDefinitions> <Border Grid.Row="2" Grid.Column="1" BorderBrush="Black" BorderThickness="2"> //Content here </Border> </Grid> _>>的API中的代码。我理解<<用作保留标识符,_用于按位右,>>用于按位左移。

但我想知道的是我们如何知道<<接受的数据类型参数是什么?以及函数如何以及为何进行偏移和舍入的按位运算?最后,为什么我得到错误无效的操作数?

请找到以下代码:

OFFSET_AND_ROUND2

请在下面找到错误消息:

#include <stdio.h>
#define OFFSET_AND_ROUND2(_a, _b) (((_a)+(1<<((_b)-1))-((_a)<0?1:0))>>(_b))

int main()
{
    printf("Hello World\n\n");
    printf("%d", OFFSET_AND_ROUND2(3.87,2));
    return 0;
}

我期待更多地了解C,谢谢!

2 个答案:

答案 0 :(得分:3)

  

但我想知道的是我们如何知道 OFFSET_AND_ROUND2 接受的数据类型参数是什么?

这是宏的问题之一。如果没有文件 明确告诉您输入和输出数据类型,然后拥有 看看如何声明宏。根据您对C的了解和 宏的复杂性,这很难猜到。这是最重要的原因之一 有经验的用户告诉最不经验的用户&#34;不要使用宏#34;。

在这种情况下,宏正在进行位操作和加法和减法。 结果类型取决于输入的类型。如果是int 输入,结果将是int

关于错误:

main.c:10:69: error: invalid operands to binary >> (have 'double' and 'int')

此处gcc告诉您,您已通过double二进制右移>> - 运算符。 您只能使用整数类型(charint执行右移和左移, long等)。任何一个都不允许浮点(floatdouble) 运营商的一面。

所以正确的电话会是

printf("%d", OFFSET_AND_ROUND2(3,2));

如果你不知道什么是移位,左移会将位模式移动到 离开,填补&#34;新&#34;比特为0.右移同样但来自 对。假设您有一个值为0x13的字节(十进制为19)

操作char x = 0x13; char y = x << 2将改变位 变量太向左,结果将存储在y

  msb = most significant bit
  lsb = least significant bit

  msb                             lsb
  +---+---+---+---+---+---+---+---+
  | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 |    == 19 (decimal)
  +---+---+---+---+---+---+---+---+

  x << 2

  msb                             lsb
  +---+---+---+---+---+---+---+---+
  | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |    == 76 (decimal)
  +---+---+---+---+---+---+---+---+

答案 1 :(得分:2)

使用宏时,preprocesser获取宏的内容并替换每个出现的内容。 举个例子:

#define A 5
...
int a = A;

被翻译为

int a = 5;

参数相同:

#define A(_a) (_a+1)
...
int a = A(2);

被翻译为

int a = (2+1);

最终,只要支持所有需要的操作,使用哪种数据类型并不重要。 错误是因为你不能在c ++中移动浮点数/双打

因为它的作用类似于搜索&amp;如有必要,使用括号替换它非常重要:

#define ADD(_a,_b) _a+_b
...
int a = ADD(5,4) * 3;

被翻译为

int a = 5+4 * 3 // = 5 + (4 * 3) = 17

而(5 + 4)* 3 = 27