小编sfs*_*man的帖子

是否通过C99中未指定的联合进行类型惩罚,并且它是否在C11中指定?

Stack Overflow问题的一些答案获取浮点数的IEEE单精度位建议使用union类型双关的结构(例如:将a的位float转换为a uint32_t):

union {
    float f;
    uint32_t u;
} un;
un.f = your_float;
uint32_t target = un.u;
Run Code Online (Sandbox Code Playgroud)

但是,uint32_t根据C99标准(至少草案n1124),联盟成员的值似乎未指定,其中第6.2.6.1.7节规定:

当值存储在union类型的对象的成员中时,对象表示的字节与该成员不对应但与其他成员对应的字节采用未指定的值.

C11 n1570草案至少有一个脚注似乎暗示不再是这种情况(见6.5.2.3中的脚注95):

如果用于读取union对象的内容的成员与上次用于在对象中存储值的成员不同,则将值的对象表示的适当部分重新解释为新类型中的对象表示形式在6.2.6中描述(一个过程有时被称为''punning'').这可能是陷阱表示.

但是,第C.6.6.1.7节中的案文与C11草案中的C99草案相同.

这种行为在C99下实际上是未指定的吗?它是否在C11中指定?我意识到大多数编译器似乎都支持这一点,但是知道它是在标准中指定还是只是一个非常常见的扩展会很好.

c c99 unions type-punning c11

58
推荐指数
3
解决办法
8770
查看次数

找到一个以单调增加然后减少序列的数字

找到以单调方式增加然后单调减小的序列中的最大值或最小值可以在O(log n)中完成.

但是,如果我想检查一个数字是否存在于这样的序列中,那么这也可以在O(log n)中完成吗?

我不认为这是可能的.考虑这个例子:1 4 5 6 7 10 8 3 2 0.

在这个例子中,如果我需要查找序列是否包含'2',我没有任何条件将搜索空间划分为原始搜索空间的一半.在最糟糕的情况下,它将是O(n),因为当我们试图搜索2时你需要检查两半.

我想知道,如果这个搜索是在O(log n)时间完成的吗?

c algorithm binary-search

10
推荐指数
1
解决办法
2571
查看次数

超出范围的C数组内容为'\ 0'但不是随机值

我有一个阵列

char * string = “hello”?
Run Code Online (Sandbox Code Playgroud)

当我读string[5],值为0.这不应该是一个随机值吗?

当我memcmp用来比较两个数组时,我的怀疑来自.argv长度比数组长度长,但它可以正常工作.我知道memcmp当它读取'\ 0'时停止,但数组没有'\ 0'.我在Dev C++上测试了这个.

c string

1
推荐指数
1
解决办法
107
查看次数

标签 统计

c ×3

algorithm ×1

binary-search ×1

c11 ×1

c99 ×1

string ×1

type-punning ×1

unions ×1