这是一个程序
#include <stdio.h>
main()
{ unsigned char i=0x80;
printf("i=%d",i<<1);
}
Run Code Online (Sandbox Code Playgroud)
它给出的输出是256.我不清楚它是什么
unsigned char i=0x80; <-- i is not int it is char so what will it store?
Run Code Online (Sandbox Code Playgroud)
我知道bitshift和十六进制的东西.如何存储i的值以及如何将其更改为256?
UPDATE
为什么在位移操作发生时没有发生溢出?
在发布此问题之前我已经检查了线程in_addr_t中的线程
我的问题不同.
我知道inet_ntoa函数属于以下类型
char * inet_ntoa (struct in_addr in);
Run Code Online (Sandbox Code Playgroud)
我想知道的是什么 in_addr_t
在套接字程序中使用它时的表示形式.
我检查了结构定义 <netinet/in.h>
typedef uint32_t in_addr_t;
struct in_addr {
in_addr_t s_addr;
};
Run Code Online (Sandbox Code Playgroud)
属于上述类型.我不想像inet_ntoa那样将in_addr_t打印到char*.我想看看in_addr_t是什么.它是如何完成的,或者究竟是什么in_addr_t以及为什么它在套接字编程中一次又一次地使用.如果我没有弄错,它被定义为
typedef uint32_t in_addr_t;
所以,如果in_addr_t是unsigned 32 bitint我想看看是什么,而不是char *在stdout上打印192.168.1.1类型的输出.
#include<stdio.h>
int main ()
{
int *ip;
printf("Enter a no \n");
scanf("%d",ip);
printf("ip=%d",*ip);
}
Run Code Online (Sandbox Code Playgroud)
以上是我的程序,当我运行它时输出
./a.out
Enter a no
10
Segmentation fault
Run Code Online (Sandbox Code Playgroud)
我在gdb第6行检查了问题是什么
scanf("%d",ip);
所以我推断这ip是一个指向整数的指针并%d期望一个地址值.虽然我试图将一个整数传递给指定的值,ip所以我认为这是错误的.但在上述情况下,正确的做法是什么.我想使用扫描并为指向的地址分配一个整数值ip(在我的情况下,这是丢失的).
我写了以下程序
#include<stdio.h>
main ()
{
extern int i;
printf("\n%d",i);
}
int i=30;
Run Code Online (Sandbox Code Playgroud)
我期待一个错误消息,因为我在main之后初始化,但相反程序给了我输出.为什么它没有给我一个错误是我想知道的.
可能重复:
','运算符在C中做什么?
好的我今天接受了采访,他们问我下面代码的输出应该是什么
#include<stdio.h>
int main ()
{
int a=1,b=1;
char c='0';
if(a,b,c)
printf("wow \n");
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上运行后,我能够得到答案,但我无法回答那里.我想知道是否允许这样的if语句?在哪里提到的?
我的问题是上面提到的if条件我无法理解if语句是如何工作的.
**更新**
我没有在K&R中找到任何这样的东西,任何人都可以推荐一本好书.我已经编程了一些东西而不是C的新东西,但是在这个问题失败之后我想再看一下如果有更深入的C概念了(特别是如上所述)提到我在哪里可以阅读.
嗯,这是一个基本问题,但我似乎很困惑.
#include<stdio.h>
int main()
{
char a[100];
printf("Enter a string\n");
scanf("%s",a);
}
Run Code Online (Sandbox Code Playgroud)
基本上上面就是我想要实现的目标.如果我输入一个字符串
James Bond
Run Code Online (Sandbox Code Playgroud)
然后我想将它存储在数组a中.但问题是因为只存在James字之间存在空格.那么我该如何解决这个问题呢?
更新
在下面给出的回复之后,我理解fgets()将是更好的选择.我想知道fgets的内部工作,为什么它能够存储带有空格的字符串,而scanf不能这样做.
我正在尝试理解原子和非原子操作.关于操作系统以及关于C.根据维基百科页面这里
考虑一个简单的计数器,不同的进程可以递增
非原子
天真的非原子实现:
读取内存位置的值;
在值上加一个;
将新值写回内存位置.
现在,想象两个进程正在运行递增单个共享内存位置:
第一个进程读取内存位置中的值;
第一个进程为值添加一个;
但是在它可以将新值写回内存位置之前它被暂停,并允许第二个进程运行:
第二个进程读取内存位置的值,与第一个进程读取的值相同;
第二个过程为值添加一个;
第二个进程将新值写入内存位置.
如何将上述操作作为一种毒性操作.我对原子操作的理解是任何不间断执行的东西都是原子的.所以举个例子
int b=1000;
b+=1000;
Run Code Online (Sandbox Code Playgroud)
根据我的理解应该是一个原子操作,因为两个指令都是在没有中断的情况下执行的,我从某个人那里学到了在C中没有任何已知的原子操作,因此上面两个语句都是非原子的.所以我想要理解的是,当涉及到编程语言而不是操作系统时,原子性是什么?
我试图了解负载均衡器如何在Linux内核中的多处理器系统上运行,
Linux调度程序基本上使用runques来存储它必须在下一次运行的任务,现在以执行load_balancer()的方式处理多处理器系统的情况,如Robert Loves书中给出的解释Linux内核开发第2版正在关注
首先,load_balance()调用find_busiest_queue()来确定最繁忙的runqueue.换句话说,这是其中包含最多进程的runqueue.如果没有比当前进程多25%或更多进程的runqueue,则find_busiest_queue()返回NULL并返回load_balance().否则,返回最繁忙的runqueue.
其次,load_balance()决定它想从中拉出的最繁忙的runqueue上的哪个优先级数组.过期的阵列是首选,因为这些任务在相对较长的时间内没有运行,因此很可能不在处理器的缓存中(即,它们不是缓存热点).如果过期的优先级数组为空,则活动的数组是唯一的选择.
接下来,load_balance()查找具有任务的最高优先级(最小值)列表,因为公平分配高优先级任务比低优先级任务更重要.
分析给定优先级的每个任务,以查找未运行的任务,不阻止通过处理器关联迁移,而不是缓存热.如果任务满足此条件,则调用pull_task()将任务从最繁忙的runqueue拉到当前的runqueue.
只要运行队列保持不平衡,就会重复前两个步骤,并将更多任务从最繁忙的队列中拉到当前.最后,当解决不平衡时,当前的runqueue被解锁并且load_balance()返回.
代码如下
static int load_balance(int this_cpu, runqueue_t *this_rq,
struct sched_domain *sd, enum idle_type idle)
{
struct sched_group *group;
runqueue_t *busiest;
unsigned long imbalance;
int nr_moved;
spin_lock(&this_rq->lock);
group = find_busiest_group(sd, this_cpu, &imbalance, idle);
if (!group)
goto out_balanced;
busiest = find_busiest_queue(group);
if (!busiest)
goto out_balanced;
nr_moved = 0;
if (busiest->nr_running > 1) {
double_lock_balance(this_rq, busiest);
nr_moved = move_tasks(this_rq, this_cpu, busiest,
imbalance, sd, idle);
spin_unlock(&busiest->lock);
}
spin_unlock(&this_rq->lock);
if (!nr_moved) {
sd->nr_balance_failed++;
if (unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2)) { …Run Code Online (Sandbox Code Playgroud) 可能重复:
来自GATE论文的c程序
这是一个正在运行的程序
#include<stdio.h>
int main ()
{
char c[]="GATE2011";
char *p=c;
printf("%s",p+p[3]-p[1]);
}
Run Code Online (Sandbox Code Playgroud)
输出是
2011
Run Code Online (Sandbox Code Playgroud)
现在问题是我无法理解p + p [3] -p [1]的操作是什么指向的?
我的理解是当我宣布某些事情时
char c[]="GATE2011"
Run Code Online (Sandbox Code Playgroud)
然后c是指向字符串常量的指针,字符串以G开头.在下一行中*p=c;
,指针p指向c指向的相同地址.那么上面的算法如何工作呢?