c - 在 C 中显示字节

标签 c byte

我正在编写一个 C 程序,它必须以十六进制答案显示每个操作,但你必须显示与数据类型对应的所有字节。

例如,如果它是一个 int,它应该显示 8 个字节,如果它是一个 short 4 字节。

它适用于所有其他数据类型,包括仅显示两个字节的 char。但是 short 在我打印的时候总是显示 8 个字节

char x5 = 0xa1;
short z5 = x5;

printf("\nProblem 1f: %x\n", z5);

并打印“问题 1f:fffffffa1”

一位同学找到了一个解决方案,其中 %hx 打印了正确的字节数,但我不明白为什么这个 %x 打印了额外的字节,这些字节来自哪里?

提前致谢!

最佳答案

这是由于静默整数类型提升。因为 0xa1 是负值(-95 dec) char, short 将被提升为 4 字节 int 并通过 printf 函数打印负值。

为防止升级,您可以使用unsigned 类型。

下面的程序说明了有符号和无符号类型的行为:

#include<stdio.h>
#include<stdlib.h>

int main() {

    char x5 = 0xa1;
    short z5 = x5;
    int i5 = x5;

    unsigned char ux5 = 0xa1;
    unsigned short uz5 = 0xa1;
    unsigned int ui5 = 0xa1;

    size_t sx5 = sizeof(x5);
    size_t sz5 = sizeof(z5);
    size_t si5 = sizeof(i5);


    printf("%zu %zu %zu\n", sx5, sz5, si5);  

    printf("%x %x %x\n", x5, z5, i5);     // silent promotion to 32 bit negative integers

    printf("%x %x %x\n", ux5, uz5, ui5);  // no promotion

    ux5 = x5;   
    uz5 = z5; // remember that z5 is negative number
    ui5 = i5; // same for i5

    printf("%x %x %x\n", ux5, uz5, ui5); // no promotion but numbers are negative ones

   return 0;
}

输出:

1 2 4
ffffffa1 ffffffa1 ffffffa1
a1 a1 a1
a1 ffa1 ffffffa1

关于c - 在 C 中显示字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48917232/

相关文章:

c - 使用归并排序按字母顺序对结构数组进行排序

c - 猜数字游戏,每个 # 都低

java - 在 Java 中显示 UTF-8 表情符号

c# - 来自字节数组的字符串不会在 C# 中被修剪?

指向 union 存储的字符指针

ruby - 在 Ruby 中从一个字节获取两个半字节

c# - C#到PHP转换器

c - 为 a 的范围寻找 pow(a^b)modN

javascript - 如何将 LLVM IR br 转换回 while 循环

c - 在不创建新线程的情况下将调试器附加到进程