反转具有不同大小的不同成员的结构的所有位的有效方法是什么?
示例结构:
typedef struct {
uint16_t mem1;
uint8_t mem2;
uint32_t mem3;
uint8_t mem4[4];
} sample_struct;
Run Code Online (Sandbox Code Playgroud) 我将科学数据转储到文件中.目前我只是将它们与它们在内存中的相同表示倾倒.我已经记录了它们是IEEE754,但是我希望在代码中声明这一点,这样如果它被移植到一个奇怪的架构并与我的文档分开(研究代码被传递),它就会在编译时出错.目前我有
static_assert(sizeof(double)==8), "message");
Run Code Online (Sandbox Code Playgroud)
有没有办法测试IEEE754?这可以是静态断言吗?
这个无辜的程序是否会调用未定义的行为:
int main(void) {
printf("%d\n", 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud) c printf undefined-behavior language-lawyer function-prototypes
我和我的同事之间U就十六进制表示的文字后缀有一些争论.请注意,这不是关于此后缀的含义或其后果的问题.我在这里找到了几个主题,但我没有找到我的问题的答案.
一些背景资料:
我们试图达成一套我们都同意的规则,从那时起就将它作为我们的风格.我们有一份2004年Misra C规则的副本,并决定将其作为起点.我们对完全符合Misra C标准不感兴趣; 我们正在挑选我们认为最能提高效率和稳健性的规则.
上述准则第10.6条规定:
"U"后缀应适用于所有无符号类型的常量.
我个人认为这是一个很好的规则.它只需要很少的努力,看起来比显式转换更好,并且更明确地显示了常量的意图.对我来说,将它用于所有未签名的内容是有意义的,而不仅仅是数字,因为通过允许异常来执行规则不会发生,特别是对于常用的常量表示.
但是,我的同事认为十六进制表示不需要后缀.主要是因为我们几乎只使用它来设置微控制器寄存器,并且在将寄存器设置为十六进制常量时,符号性无关紧要.
我的问题
我的问题不在于谁是对还是错.它是关于确定是否存在后缀的缺失或存在改变操作结果的情况.有没有这样的情况,还是一致性问题?
编辑:澄清; 特别是关于通过为它们分配十六进制值来设置微控制器寄存器.是否会出现后缀可能会产生影响的情况?我觉得不会.例如,飞思卡尔处理器专家将所有寄存器分配生成为无符号.
ungetc()似乎在一些角色上失败了.这是一个简单的测试程序:
#include <stdio.h>
int main(void) {
int c;
printf("Type a letter and the enter key: ");
#define TRACE(x) printf("%s -> %d\n", #x, x)
TRACE(c = getc(stdin));
TRACE(ungetc(c, stdin));
TRACE(getc(stdin));
TRACE(ungetc('\xFE', stdin));
TRACE(getc(stdin));
TRACE(ungetc('\xFF', stdin));
TRACE(getc(stdin));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在unix系统上运行它并a Enter在提示符下输入
输出是:
Type a letter and the enter key: a
c = getc(stdin) -> 97
ungetc(c, stdin) -> 97
getc(stdin) -> 97
ungetc('\xFE', stdin) -> 254
getc(stdin) -> 254
ungetc('\xFF', stdin) -> -1
getc(stdin) -> 10
Run Code Online (Sandbox Code Playgroud)
我期待这个:
Type …Run Code Online (Sandbox Code Playgroud) 我知道将两个变量初始化为 的单一遍历方法INT_MIN。但我的问题是为什么我们要初始化两个变量INT_MIN以及这里的目的是什么INT_MIN?
为什么我们不能像我在下面的代码中所做的那样将两个变量初始化为其第一个元素?因为当我手动检查代码时,没有发现任何错误。那么为什么代码不能正常运行呢?
#include <stdio.h>
int main(void) {
int x[10];
int i, n;
int first = x[0];
int second = x[0];
printf("Input the size of array :");
scanf("%d", &n);
printf("Input %d elements in the array :\n", n);
for (i = 0; i < n; i++) {
printf("x[%d]: ", i);
scanf("%d", &x[i]);
}
for (i = 0; i < n; ++i) {
if (first < x[i]) {
second = first;
first = x[i];
} else …Run Code Online (Sandbox Code Playgroud) 这个算法是mergesort,我知道这可能看起来很奇怪,但我主要关注的是计算这个算法的空间复杂度.
如果我们查看mergesort函数的递归树并尝试跟踪算法,那么堆栈大小将是log(n).但由于merge功能也有内部的mergesort,其产生的大小两个数组n/2,n/2,那么首先应该我觉得递推关系的空间复杂度,然后,我要补充的是中n/2 + n/2,这将成为O(log(n) + n).
我知道答案,但我在这个过程中感到困惑.谁能告诉我正确的程序?
这种混淆是由于合并函数,它不是递归的,而是在递归函数中调用
为什么我们说空间复杂性将O(log(n) + n)通过递归函数空间复杂度的定义,我们通常计算递归树的高度
Merge(Leftarray, Rightarray, Array) {
nL <- length(Leftarray)
nR <- length(Rightarray)
i <- j <- k <- 0
while (i < nL && j < nR) {
if (Leftarray[i] <= Rightarray[j])
Array[k++] <- Leftarray[i++]
else
Array[k++] <- Rightarray[j++]
}
while (i < nL) {
Array[k++] <- Leftarray[i++]
}
while (j < nR) {
Array[k++] …Run Code Online (Sandbox Code Playgroud) 从维基百科的文章似乎的补代表性符号整数基本上是过时的,但他们提一些优利系统,即UNIVAC2200分之1100系列作为仍然支持这种表示。
Unisys Clearpath 系列中的最新系统是否仍然支持和使用其补充?
既然他们使用intel芯片,他们需要模拟器吗?这性能如何?
是否有针对这种架构的 C 编译器?
我有下面的 c# 方法来比较两个数据表并返回不匹配的记录。
public DataTable GetTableDiff(DataTable dt1, DataTable dt2, string columnName)
{
var StartTime = DateTime.Now;
dt1.PrimaryKey = new DataColumn[] { dt1.Columns["N"] };
dt2.PrimaryKey = new DataColumn[] { dt2.Columns["N"] };
DataTable dtDifference = null;
//Get the difference of two datatables
var dr = from r in dt1.AsEnumerable()
where !dt2.AsEnumerable().Any(r2 => r["N"].ToString().Trim().ToLower() == r2["N"].ToString().Trim().ToLower()
&& r[columnName].ToString().Trim().ToLower() == r2[columnName].ToString().Trim().ToLower())
select r;
if (dr.Any())
{
dtDifference = dr.CopyToDataTable();
}
return dtDifference;
}
Run Code Online (Sandbox Code Playgroud)
此代码有效,但比较数据表中的 10,000 条记录需要 1.24 分钟。有什么办法可以让它更快?
N是主键,columnName是要比较的列。
谢谢。
我有三个变量:a, b, c。假设它们是整数。我想按特定顺序在其中找到第一个非零值,而不需要循环。以下似乎有效,但我不确定这是因为我很幸运,还是因为语言保证了这一点:
int main(int argc, char *argv[]) {
int a = 0;
int b = 3;
int c = 5;
int test;
if ((test = a) != 0 || (test = b) != 0 || (test = c) != 0) {
printf("First non-zero: %d\n", test);
} else {
printf("All zero!\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此处显示的带有短路的重复分配是否保证按预期工作,还是我遗漏了什么?
这可能是一个可以接受三个字母答案的地方,但两个字母的答案可能需要更多解释。