小编bak*_*kra的帖子

C拼图:你将如何在控制台上打印一些东西?

/*you cannot change anything from here below*/
main()
{
exit(0);
}
/*you cannot change anything from here up*/
Run Code Online (Sandbox Code Playgroud)

这是在一次采访中被问到的.

我被告知要在控制台上打印一些东西.

任何人?

c puzzle

10
推荐指数
4
解决办法
1777
查看次数

算术运算期间的数据类型提升:-1 <(unsinged int)1 == false

main()  {   
  if ( -1 < (unsigned char) 1 )
    printf("less than");
  else        
    printf("NOT less than");
} 
Run Code Online (Sandbox Code Playgroud)

打印less than.因为,(unsigned char) 1 转换为 (signed char) 1然后:(signed) -1 < (signed) 1,因此输出less than.

但是,如果我将上面的代码更改if ( (-1 < (unsigned int) 1 )

那么输出就是NOT less than.

所以很明显,当我将unsigned char更改为unsigned int时:

  • (signed)-1转换为unsigned int [正好相反]
  • 因为-1被存储为2的恭维1; 位模式评估为255(可能)
  • 因此255 <1将评估为false,否则将执行.
  • 即使你代替int a = -1;'-1'相同的结果替代

问题:

  1. 在有符号和无符号算术期间...如何确定签名是否将转换为无符号或反之亦然.

  2. 为什么unsigned char和char之间的算术转换不同:显然unsigned转换为signed和unsigned int和int:显然签名转换为unsigned

PS:我知道这不依赖编译器.所以不要说它.

c unsigned integer-promotion

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

将文本文件的MD5哈希保存到同一文本文件中?

今天我读到了MD5哈希,并想知道这是否可行.看起来像一个递归问题...还是有解决方案?

c security hash md5

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

如何根据"Endianness"将数据存储在位级别?

我读到有关Endianness的信息,并了解蹲...

所以我写了这个

main()
{
    int k = 0xA5B9BF9F;

    BYTE *b = (BYTE*)&k;    //value at *b is 9f
    b++;    //value at *b is BF
    b++;    //value at *b is B9
    b++;    //value at *b is A5
}
Run Code Online (Sandbox Code Playgroud)

k 等于 A5 B9 BF 9F

和(字节)指针" walk "o/p是9F BF b9 A5

所以我得到它的字节向后存储......好吧.

所以现在我想它是如何存储在BIT级别的......

我的意思是"9f"(1001 1111)存储为"f9"(1111 1001)?

所以我写了这个

int _tmain(int argc, _TCHAR* argv[])
{
    int k = 0xA5B9BF9F;
    void *ptr = &k;
    bool temp= TRUE;
    cout<<"ready or not here I come \n"<<endl; …
Run Code Online (Sandbox Code Playgroud)

c pointers endianness bit

3
推荐指数
2
解决办法
1984
查看次数

Windows内核模式驱动程序如何访问分页内存?

1)用户模式进程具有其自己的"地址上下文",其将用户模式虚拟地址映射到唯一的物理页面帧集合.也就是说,当Windows XP调度程序切换线程时,任何特定虚拟地址的含义都会随时改变.

"切换线程"的部分工作是更改页表,以便它们引用传入线程的进程上下文.

_

2)Windows内核模式驱动程序在"任意线程上下文"中执行.

驱动程序可以创建一个系统线程并在其上下文中工作......但我正在讨论当一个人没有创建系统线程时的情况.

驱动程序可以使用"ExAllocatePoolWithTag"来分配分页(内存在易失性存储中).

_

3)那么驱动程序如何在没有任何上下文的情况下访问分页内存?

如第1点所示,通过"特定于上下文"的页表访问分页内存.

当驱动程序在一些其他线程上下文中运行时...即页表条目指向线程相关的phy.mem,那么驱动程序如何才能访问他的分页内存?

PS:我在内核编程方面的努力.别生气.

operating-system kernel window driver wdm

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

循环中的宏?

for(x;x<crap;x++)
{
    macro(x,y);
}
Run Code Online (Sandbox Code Playgroud)

预处理器如何处理?这个循环是展开还是别的?

macros preprocessor loops

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

修改了c中的常量

const int z = 420;

printf("\n%d | %d",z ,*(&(*(&z+1))-1) );
// O/P:420 | 420

printf("\n%u | %u",&z,(&(*(&z+1))-1) );             //address
// O/P:1310548  | 1310548

*((char *)&z+1) = 21;       //I change value for the 1st-Bit
                                    //corrupting constant

 printf("\n%d | %d",z ,*(&(*(&z+1))-1) );
//the complex(not really) expression evaluates to z
// O/P:420| 5540

printf("\n%u | %u",&z ,(&(*(&z+1))-1) );                
//the complex(not really) expression evaluates to &z
// O/P:1310548 | 1310548
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

似乎我已成功修改了C中的常量

通过修改我的意思是我已经改变了常量地址范围中的位

因为"复杂(不是真的)统一/身份表达"在腐败后改变了价值.

但是z保持不变.为什么?

在解引用时,同一地址如何具有不同的值.?

PS:你可以使用任何身份表达

eg.printf("%d",*(int*)((char*)&(*((char*)&z+1))-1));
Run Code Online (Sandbox Code Playgroud)

[编辑]

好吧让我重新说一下:

z = 420

&z …
Run Code Online (Sandbox Code Playgroud)

c pointers constants

-1
推荐指数
3
解决办法
191
查看次数