变量每次接收0x00,与变量无关

好东西

这是我正在使用的简单C文件。本质上,我希望测试每个ASCII字符是否相反(例如0x5b5b5b5b和0x24242424,其中5b nad 24是ASCII)。

#include <stdio.h>
#define SHOW 0

int main(){
    char c = '\x00';
    int i = 100;
    long long var1 = 0x5b5b5b5b;
    long long var2 = 0x24242424;
    printf("%d - %d - %d\n", i, var1, var2);
    i &= var1;
    printf("%d - %d - %d\n", i, var1, var2);
    i &= var2;
    printf("%d - %d - %d\n", i, var1, var2);

    /*
     * If they want to actually list them all, keep SHOW = 1
     */
    if(SHOW)
        for(c = '\x20'; c < 0x7E; c++)
            if(~c - 0xffffff00 - 0x80 > 0x20 && ~c - 0xffffff00 - 0x80 <= 0x7e)
                printf("AND reg, %x\nAND reg, %x\n\n", c, (~c - 0xffffff00 - 0x80));
    /*
     * If they want to test var1 and var2
     */
    if(!SHOW)
        if(i==0)
            printf("0x%x and 0x%x are opposites!\n", var1, var1);
    //Why does the second one return 0 every time?
}

我有一些调试printf,并且错误表明未填充var2。我将其值更改为无济于事。为什么未为其分配值?

侏儒

类型的表示取决于机器。根据您似乎在描述的计算机行为,长的long可能会收到长的内存空间的两倍,并且您的计算机使用低端数字表示。   

当您调用printf时,参数以相反的顺序推入堆栈(内存顺序通常从高到低;以字节为单位进行分配/假定的方式,例如在我的(旧)机器上):

mem allocated     long(int)    long long

     arg2            4             8
     arg1            4             8
  fmt string         x             x   

其中x是格式字符串的字节大小。当您打印一个long long变量(例如8个字节),然后再打印一个int格式说明符(%d)的long变量(例如4个字节)时,这在long情况下可以正常工作,long和int可能具有您计算机上的相同字节宽度。   

由于时间不长,它们的宽度可能是上面假设的两倍。当您查看上面的堆栈时,这意味着如果推入2个long long,但使用%d说明符,则printf假设fmt字符串之后的前4个字节是第一个参数,接下来的4个字节是第二个参数。 。但是,这8个字节实际上构成了第一个long long参数。用little-endian表示法,前4个字节是其低位字节,与您的第一个变量一致-因此arg 1打印良好。接下来的4个字节将是高位字节-全部为0,因此printf始终为您的第二个变量打印0。正如它应该。   

阅读格式说明符:适当时使用%d,%ld等;并始终使用警告进行编译,因为您的编译器会通过发出警告来提示您出了什么问题(带有gcc的-Wall)。    

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

变量每次接收0x00,与变量无关

来自分类Dev

变量INT类型接收0,而与键入的数字无关

来自分类Dev

变量INT类型接收0,而与键入的数字无关

来自分类Dev

信号从0100变为0X00

来自分类Dev

*(volatile unsigned int *) 0x00 = 0x00 的含义;

来自分类Dev

从Byte []到int []而不修整0x00

来自分类Dev

查找包含填充符(0x00)的文件

来自分类Dev

ByteArray的String.Format将0x00转换为0,如何保留00

来自分类Dev

蓝牙数据显示为0X80而不是0X00

来自分类Dev

SPI_I2S_ReceiveData始终返回0xff或0x00

来自分类Dev

如何使用Qt QSerialPort发送十六进制0x00

来自分类Dev

十六进制值0x00是加载XML文档的无效字符

来自分类Dev

Android NfcV读取标签始终位于0x00之前

来自分类Dev

如何用0x00覆盖所有可用磁盘空间?

来自分类Dev

表示一个以0x00作为字符串的文件

来自分类Dev

SQL错误:用于编码“ UTF8”的无效字节序列:0x00

来自分类Dev

将0x00分配给C中的数组?

来自分类Dev

写入0x00之后,是否可以立即停止密码清除可用空间?

来自分类Dev

如何使用Qt QSerialPort发送十六进制0x00

来自分类Dev

打印算法:十六进制数组 printf 在 value[index] = 0x00 时中断

来自分类Dev

为什么ACR38U-CCID总是返回0x6e 0x00?

来自分类Dev

`method_missing':#<Rails :: Application :: Configuration:0x00>的未定义方法`action_mailer'

来自分类Dev

为什么BSON字符串(不是Cstring / ename)后面的0x00字节结尾?

来自分类Dev

分支指令如何在相对偏移为0x00(获取/执行周期)的6502上工作?

来自分类Dev

Web服务生成错误的xml:十六进制值0x00是无效字符错误

来自分类Dev

有什么方法可以在Windows上将空字节(ASCII 0x00)复制到剪贴板吗?

来自分类Dev

将 oracle 迁移到 postgresql 用于编码“UTF8”的无效字节序列:0x00

来自分类Dev

Pentaho Data Integrator 中的错误 - 编码“UTF8”的字节序列无效:0x00

来自分类Dev

如何让结构接收不是系统变量的变量

Related 相关文章

  1. 1

    变量每次接收0x00,与变量无关

  2. 2

    变量INT类型接收0,而与键入的数字无关

  3. 3

    变量INT类型接收0,而与键入的数字无关

  4. 4

    信号从0100变为0X00

  5. 5

    *(volatile unsigned int *) 0x00 = 0x00 的含义;

  6. 6

    从Byte []到int []而不修整0x00

  7. 7

    查找包含填充符(0x00)的文件

  8. 8

    ByteArray的String.Format将0x00转换为0,如何保留00

  9. 9

    蓝牙数据显示为0X80而不是0X00

  10. 10

    SPI_I2S_ReceiveData始终返回0xff或0x00

  11. 11

    如何使用Qt QSerialPort发送十六进制0x00

  12. 12

    十六进制值0x00是加载XML文档的无效字符

  13. 13

    Android NfcV读取标签始终位于0x00之前

  14. 14

    如何用0x00覆盖所有可用磁盘空间?

  15. 15

    表示一个以0x00作为字符串的文件

  16. 16

    SQL错误:用于编码“ UTF8”的无效字节序列:0x00

  17. 17

    将0x00分配给C中的数组?

  18. 18

    写入0x00之后,是否可以立即停止密码清除可用空间?

  19. 19

    如何使用Qt QSerialPort发送十六进制0x00

  20. 20

    打印算法:十六进制数组 printf 在 value[index] = 0x00 时中断

  21. 21

    为什么ACR38U-CCID总是返回0x6e 0x00?

  22. 22

    `method_missing':#<Rails :: Application :: Configuration:0x00>的未定义方法`action_mailer'

  23. 23

    为什么BSON字符串(不是Cstring / ename)后面的0x00字节结尾?

  24. 24

    分支指令如何在相对偏移为0x00(获取/执行周期)的6502上工作?

  25. 25

    Web服务生成错误的xml:十六进制值0x00是无效字符错误

  26. 26

    有什么方法可以在Windows上将空字节(ASCII 0x00)复制到剪贴板吗?

  27. 27

    将 oracle 迁移到 postgresql 用于编码“UTF8”的无效字节序列:0x00

  28. 28

    Pentaho Data Integrator 中的错误 - 编码“UTF8”的字节序列无效:0x00

  29. 29

    如何让结构接收不是系统变量的变量

热门标签

归档