Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将uint64\u t与无符号字符进行比较*_C - Fatal编程技术网

C 将uint64\u t与无符号字符进行比较*

C 将uint64\u t与无符号字符进行比较*,c,C,我有这个POC #include <stdio.h> #include <stdint.h> int main(void) { unsigned char *c = "This is "; uint64_t i; int j; i = c[7] | (c[6] << 8) | (c[5] << 16) | (c[4] << 24) | (c[3] << 32) | (c[2] <<

我有这个POC

#include <stdio.h>
#include <stdint.h>

int main(void) {
    unsigned char *c = "This is ";
    uint64_t i;
    int j;
    i = c[7] | (c[6] << 8) | (c[5] << 16) | (c[4] << 24) | (c[3] << 32) | (c[2] << 40) | (c[1] << 48) | (c[0] << 56);
    printf("c value: '%s'\n", c);
    printf("Hex:");
    for (j = 0; j < 8; j++) {
        printf(" %2x", c[j]);
    }
    printf("\n");

    printf("Is i equal to c? %d\n", 
        memcmp((unsigned char *)&i, "\x54\x68\x69\x73\x20\x69\x73\x20", 8)
    );
    return 0;
}
#包括
#包括
内部主(空){
unsigned char*c=“这是”;
uint64_t i;
int j;
i=c[7]|(c[6]如果您使用以下代码:

#include <stdio.h>
#include <stdint.h>
#include <string.h>
int main(void) {
    unsigned char *c = "This is ";
    uint64_t i;
    int j;
    i = (uint64_t ) c[7] | ((uint64_t )c[6] << 8) | ((uint64_t )c[5] << 16) | ((uint64_t )c[4] << 24) | ((uint64_t )c[3] << 32) | ((uint64_t )c[2] << 40) | ((uint64_t )c[1] << 48) | ((uint64_t )c[0] << 56);
    printf("c value: '%s'\n", c);
    printf("Hex:");
    for (j = 0; j < 8; j++) {
        printf(" %2x", c[j]);
    }
    printf("\n");

    printf("Printing i contents as they appear in memory \n");
    unsigned char *k=(unsigned char*)&i;
    for(int j = 0;j<8 ;j++)
        printf("%2x ",(unsigned) k[j]);
    printf("\n");

    printf("Is i is equal to c? %d\n",
           memcmp(&i, "\x54\x68\x69\x73\x20\x69\x73\x20", 8)
           );
    return 0;
}
您可以看到存储在内存中的字节是反向的。这应该会提示您,如果您的电脑是little endian,
i
的最低有效字节“”将存储在内存地址的开头。

如果您使用此代码:

#include <stdio.h>
#include <stdint.h>
#include <string.h>
int main(void) {
    unsigned char *c = "This is ";
    uint64_t i;
    int j;
    i = (uint64_t ) c[7] | ((uint64_t )c[6] << 8) | ((uint64_t )c[5] << 16) | ((uint64_t )c[4] << 24) | ((uint64_t )c[3] << 32) | ((uint64_t )c[2] << 40) | ((uint64_t )c[1] << 48) | ((uint64_t )c[0] << 56);
    printf("c value: '%s'\n", c);
    printf("Hex:");
    for (j = 0; j < 8; j++) {
        printf(" %2x", c[j]);
    }
    printf("\n");

    printf("Printing i contents as they appear in memory \n");
    unsigned char *k=(unsigned char*)&i;
    for(int j = 0;j<8 ;j++)
        printf("%2x ",(unsigned) k[j]);
    printf("\n");

    printf("Is i is equal to c? %d\n",
           memcmp(&i, "\x54\x68\x69\x73\x20\x69\x73\x20", 8)
           );
    return 0;
}
您可以看到存储在内存中的字节是反向的。这应该会提示您,如果您的电脑是little endian,
i
的最低有效字节“”将存储在内存地址的开头。

如果您使用此代码:

#include <stdio.h>
#include <stdint.h>
#include <string.h>
int main(void) {
    unsigned char *c = "This is ";
    uint64_t i;
    int j;
    i = (uint64_t ) c[7] | ((uint64_t )c[6] << 8) | ((uint64_t )c[5] << 16) | ((uint64_t )c[4] << 24) | ((uint64_t )c[3] << 32) | ((uint64_t )c[2] << 40) | ((uint64_t )c[1] << 48) | ((uint64_t )c[0] << 56);
    printf("c value: '%s'\n", c);
    printf("Hex:");
    for (j = 0; j < 8; j++) {
        printf(" %2x", c[j]);
    }
    printf("\n");

    printf("Printing i contents as they appear in memory \n");
    unsigned char *k=(unsigned char*)&i;
    for(int j = 0;j<8 ;j++)
        printf("%2x ",(unsigned) k[j]);
    printf("\n");

    printf("Is i is equal to c? %d\n",
           memcmp(&i, "\x54\x68\x69\x73\x20\x69\x73\x20", 8)
           );
    return 0;
}
您可以看到存储在内存中的字节是反向的。这应该会提示您,如果您的电脑是little endian,
i
的最低有效字节“”将存储在内存地址的开头。

如果您使用此代码:

#include <stdio.h>
#include <stdint.h>
#include <string.h>
int main(void) {
    unsigned char *c = "This is ";
    uint64_t i;
    int j;
    i = (uint64_t ) c[7] | ((uint64_t )c[6] << 8) | ((uint64_t )c[5] << 16) | ((uint64_t )c[4] << 24) | ((uint64_t )c[3] << 32) | ((uint64_t )c[2] << 40) | ((uint64_t )c[1] << 48) | ((uint64_t )c[0] << 56);
    printf("c value: '%s'\n", c);
    printf("Hex:");
    for (j = 0; j < 8; j++) {
        printf(" %2x", c[j]);
    }
    printf("\n");

    printf("Printing i contents as they appear in memory \n");
    unsigned char *k=(unsigned char*)&i;
    for(int j = 0;j<8 ;j++)
        printf("%2x ",(unsigned) k[j]);
    printf("\n");

    printf("Is i is equal to c? %d\n",
           memcmp(&i, "\x54\x68\x69\x73\x20\x69\x73\x20", 8)
           );
    return 0;
}


您可以看到存储在内存中的字节是反向的。这应该会提示您,如果您的电脑是little endian,
i
的最低有效字节“”将存储在内存地址的开头。

当您移动类似
c[0]的值时请在发布前启用所有警告进行编译,编译器将为您提供一系列线索。您确定您的计算机是Big-Endian吗?现在大多数都不是(当然不是基于Intel的计算机)这不是有效的C++,请删除C++标签,C也不是C++。@ UsReNAMEXY不可用:严格地说,它也不是有效的C。C字符串文字类型是<代码> char [n] < /C>。在“代码>未签名CHAR*C=”这是“”;,<代码> char(9)“
literal的值衰减为
char*
。尝试将
char*
值分配给
unsigned char*
对象是一种违反约束的行为。(例如,默认情况下,gcc不会对此进行诊断,但当您移动类似
c[0]的值时,它会发出一个带有
gcc-pedantic
的警告。)请在发布前启用所有警告进行编译,编译器将为您提供一系列线索。您确定您的计算机是Big-Endian吗?现在大多数都不是(当然不是基于Intel的计算机)这不是有效的C++,请删除C++标签,C也不是C++。@ UsReNAMEXY不可用:严格地说,它也不是有效的C。C字符串文字类型是<代码> char [n] < /C>。在“代码>未签名CHAR*C=”这是“”;,<代码> char(9)“
literal的值衰减为
char*
。尝试将
char*
值分配给
unsigned char*
对象是一种违反约束的行为。(例如,默认情况下,gcc不会对此进行诊断,但当您移动类似
c[0]的值时,它会发出一个带有
gcc-pedantic
的警告。)请在发布前启用所有警告进行编译,编译器将为您提供一系列线索。您确定您的计算机是Big-Endian吗?现在大多数都不是(当然不是基于Intel的计算机)这不是有效的C++,请删除C++标签,C也不是C++。@ UsReNAMEXY不可用:严格地说,它也不是有效的C。C字符串文字类型是<代码> char [n] < /C>。在“代码>未签名CHAR*C=”这是“”;,<代码> char(9)“
literal的值衰减为
char*
。尝试将
char*
值分配给
unsigned char*
对象是一种违反约束的行为。(例如,默认情况下,gcc不会对此进行诊断,但当您移动类似
c[0]的值时,它会发出一个带有
gcc-pedantic
的警告。)请在发布前启用所有警告进行编译,编译器将为您提供一系列线索。您确定您的计算机是Big-Endian吗?现在大多数都不是(当然不是基于Intel的计算机)这不是有效的C++,请删除C++标签,C也不是C++。@ UsReNAMEXY不可用:严格地说,它也不是有效的C。C字符串文字类型是<代码> char [n] < /C>。在“代码>未签名CHAR*C=”这是“”;,<代码> char(9)“
文本的值衰减为
char*
。尝试将
char*
值分配给
无符号char*
对象是违反约束的行为。(例如,默认情况下,gcc不会对此进行诊断,但它会发出带有
gcc-pedantic
的警告)删除了我的答案,因为这样更好。我要添加的是,
gcc-Wall
指出了错误。事实上,我丢失了转换和字节的倒序。谢谢您删除了我的答案,因为这样更好。我要添加的是,
gcc-Wall
指出了错误。事实上,我丢失了转换和字节的倒序。谢谢你删除了我的答案,因为这更好。我要添加的是,
gcc-Wall
指出了错误。事实上,我丢失了转换和字节的倒序。谢谢你删除了我的答案,因为这更好。我要添加的是,
gcc-Wall
指出了错误。事实上,我丢失了转换和字节的倒序谢谢