【发布时间】:2011-09-17 14:11:48
【问题描述】:
我在 C 中有以下示例:
int x = 123;
size of int = 4 bytes.
hex value = 7b
binary value = 0111 1011
如果我的 x 是字符,那么十六进制/二进制值是多少?
char x = 123;
size of char = 1 byte.
hex value = ??
binary value = ??
【问题讨论】:
我在 C 中有以下示例:
int x = 123;
size of int = 4 bytes.
hex value = 7b
binary value = 0111 1011
如果我的 x 是字符,那么十六进制/二进制值是多少?
char x = 123;
size of char = 1 byte.
hex value = ??
binary value = ??
【问题讨论】:
由于char 小于int,所以它是相同的。除了前导零,您会在 int 中找到。
试试这个:
6 int x = 123;
7
8 printf ("Size of int is %d bytes\n", sizeof(int));
9 printf ("Size of char is %d byte\n", sizeof(char));
10
11 printf ("Hex value is %x\n", x);
12 printf ("Hex value is %x\n", (char)x);
13
14 printf ("As for binary value .... google is your friend\n");
输出是:
Size of int is 4 bytes
Size of char is 1 byte
Hex value is 7b
Hex value is 7b
至于二进制值....谷歌是你的朋友 这个site 似乎解释得很好
【讨论】:
无论原始类型如何,十进制 123 都是十六进制的 0x7b 和二进制的 0111 1011。唯一会妨碍类型的是溢出(例如int x = 48273; char y = (char)x;)。有时,signed char 和 unsigned char 的显示可能会有所不同。
【讨论】:
它的十六进制和二进制值将完全相同(如果您想将其扩展为完整大小,可能会出现前导零)。
这是因为 123 正好适合 char。带符号的字符至少可以保存值-127 到127(二进制补码可以处理-128,但是 ISO 标准允许将补码和符号/大小作为负数的其他两种编码,这两种编码都不能处理-128),至少是一个无符号字符 0 到 255。
假设 8 位字节和 4 字节 int:
Value HexInt HexChar BinaryInt BinaryChar
----- ------ ------- --------------------------------------- ----------
123 7B 7B 0000 0000 0000 0000 0000 0000 0111 1011 0111 1011
二进制值0111 1011计算如下:
0111 1011
||| | ||
||| | |+- 1
||| | +-- 2
||| |
||| +---- 8
||+------ 16
|+------- 32
+-------- 64
===
123
如果您要尝试将值放入大于 8 位的 8 位 char,则通常保留最低有效位。
char xyz = 0x1234; // results in xyz being given the value 0x34.
这在 C99,6.3.1.3/2 和 /3 部分有详细说明:
1/当一个整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新的类型表示,则不变。
2/否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上重复加减1,直到值在新类型的范围内。
3/ 否则,新类型是有符号的,值不能在其中表示;结果要么是实现定义的,要么引发实现定义的信号。
【讨论】:
应该是一样的。 0x7b 十六进制 , 0111 1011
请注意,如果您的整数是 4 个字节,那么它的位是 0000 0000 0111 1011。
【讨论】: