为什么'x90'和0x90彼此不同。我知道一个是十六进制转义序列,另一个是十六进制数。但是,如果我将它们转换为十进制,则得到144,这应该是'x90'和0x90'的值。另外,书中说'x90'是负值,而0x90是正值。
据我所知,char只有1个字节,int是4,所以我们可以得到
1 2
| char '\x90' = 1001 0000 ( 1 byte,8 bits)
int 0x90 = 1001 0000 0000 0000 0000 0000 0000 0000 (4 byte,32 bits) |
但我还是不明白为什么char x90是负数,导致的值与int 0x90的值不同。
我的问题不是关于有符号和无符号字符,尽管这与我的问题有关,但我在问那些字符的into值。
- 似乎char是编译器中的有符号类型(一个常见选项)。因为char只有8位,所以它只能表示正数0..127和-1..-128。0x90是144,所以它不能适应0..127。它"溢出",最后表示-112。但这纯粹是解释——在任何情况下,比特都是一样的。
- 你能解释一下这个过程是怎么变成-112的吗?
- 谷歌"两个补充"
- 如果我用二进制计算两个补码,这两个值是否相同?因为这个过程是把它们转换成二进制的,把0和1换成1的补码,然后加1得到2的补码。
- @你知道为什么a和b在这里返回-1,而c和d不返回吗?
- 我猜是因为unsigned永远不会是负数,它不会返回-1
- @霍拉霍拉不会停在那里。如果int是4个字节,那么您有0000 0000 0000 0000。你为什么得到-1而不是1111 1111 1111 1111十进制65635?我把所有的部分都倒过来了。这也是你在这里的主要问题。
- 默认情况下,可能重复的字符是有符号的还是无符号的?
- 0x90-256=-112,简单如此。这就是二者互补的原理。
Why are '\x90' and 0x90 different from each other(?)
号
第一个是转义序列,第二个是整数常量。它们具有相同的值和类型。
I fail to understand why the char x90 is negative and leads to difference value than int 0x90.
号
当分配给char时,它们都具有相同的值。
'\x90'、0x90和144都是c中的整数常数,3个都有相同的类型,int和相同的值:144。
一个char要么像一个signed char要么像一个unsigned char一样。显然,在OP的情况下,它的作用就像一个范围为[-128]的signed char。127。
以char ch = 144;为例
分配144,这超出了OP的char的范围,导致实现定义的行为。这意味着实现可以做各种事情,比如像分配ch = 127;那样分配最大值。最常见的实现定义行为是重复地加/减256,直到和在范围内。这是144-256-->-112。
当把144看作8位unsigned char和-112看作8位有符号char时,它们都有相同的位模式1001 0000。
- 三个人都有…相同值:144。如果默认情况下签署char,则不为真。
- @chqrlie '\x90', 0x90, 144都是int类型的具有相同值的整数。目前根本不涉及char。char的符号性与确定这些常数的类型/值无关。
- char不应介入,但它是…这三个都有c中的int类型,但如果char有符号且8位宽,则值不相同。
- @chqrlie整定值的确定不以任何方式涉及char。c没有int常量字面值。也许你在想另一种语言?
- 与直觉相反的是:c11 6.4.4.4&167;10:整型字符常量具有int类型。包含映射到单字节执行字符的单个字符的整型字符常量的值是被映射字符表示为整型的数值。…如果整型字符常量包含单个字符或转义序列,则其值是将值为单个字符或转义序列值的char类型的对象转换为int类型时产生的值。
- @chqrlie同意char确实会影响整型字符常量包含单个字符或转义序列,正如您所引用的那样。
- 是的,结论是,在128之前,十六进制转义序列和int十六进制是相同的,在这之后,char溢出,超出了本例(144)中的范围。
- 在Java中,情况可能完全不同,因为字符是2字节。
charis 1字节=8位。如果我们考虑它"(only to be Unsigned"号当时正0x90 = 144),which is to hold没有问题。P></
charunsignedbut is not。meaning is reserved,一位正或负载(to the符号位)。therefore只有7位代表的正是used to the maximum number。27=128。当你试图assign 0x90is to char,它比空气日期2010年1月17 therefore正为最大值。This is signed Undefined溢出和行为。P></
我会在最implementations to the negatives wrap,知道恩- 128 -而不是becomes(128~144)=+16=-112-128。P></
比特may be the same the,but is not the解说。P></
disclaimer(the actual正为最大值:You can hold 7位是127,和我说让我说我最敏锐的感恩。that is one of the values 0 accounted must be for the real,知道公式2^n - 1 is where is the number of n位。the maximum value考虑1位;即使是1 2 1 = 2)P></
- 准确地说,char可以有8位以上,可以有符号或无符号
在C和0x90are both int'\x90'等文字,but they have a different value if the May and has is signed char型8位。在这房子的价值,'\x90'has is of -112whereas 0x90144Always。P></
标准:specifies this the cP></
6.4.4.4 Character constants.
§10 An integer character constant has type int. The value of an integer character constant containing a single character that maps to a single-byte execution character is the numerical value of the representation of the mapped character interpreted as an integer. The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined. If an integer character constant contains a single character or escape sequence, its value is the one that results when an object with type char whose value is that of the single character or escape sequence is converted to type int.
因此,在'\x90'has the character of constant值(int)(char)0x90which is is if the char144型模式是默认signed 8位比前更广泛。-112otherwise is as its value to be the房子似乎你的在线系统。P></
- 谢谢,但我真的不知道"x90"的值是多少-112。如何找到'x90'的两个补码?它不是和0x90的两个补码一样吗?
- 根据编译器默认设置,char类型可以有符号或无符号。如果有符号,第8位的非零位值的字符常量将为负数。
代表的价值都一样。他们在哪里在差分is the used。P></
\x90is a character has char布尔型常数。inside of this is needed序列或者单或双quotes quotes.0x90is a constant of integer型inthexadecimal is not used within,和EN quotes.P></
As for正/负整数常数,除非他们有一个int型AISI型denoting后缀。自从0x90inside the range of an intFITS,它有积极的价值。如果你分配到charit to the value of type变量范围外的谎言,charis of the rian的定义和执行转换的仪表美。P></
similarly Escape,\x90has the unsigned char型序列。used within a character if such as constant '\x90'en is to the value转换char,不管一个人多是"the en is of char知道了范围的转换。P></
for example:P></
1 2 3 4 5 6 7 8
| int a = 0x90; // valid, has value 144
int b = '\x90'; // valid, has value -114
char c = 0x90; // invalid, value out of range
char d = '\x90'; // invalid, same as above
unsigned char e[] ="\x90\x90"; // valid, string containing two bytes
char f[] ="\x90\x90"; // invalid, string containing two bytes but values are out of range
char g = \x90; // invalid, compile error
char h ="0x90" // valid, but contains the characters '0', 'x', '9', '0' |
- 我相信这两个值是不同的,正如编译器显示的'x90'为-114,0x90为144
- 这是不对的。0x90在隐式常量转换中以溢出结束。
- 是的,那是真的……这里我说的是char'x90'和int 0x90
- 恐怕你的答案不适合C语言。C++有点不那么错误,但仍然没有关闭。
- @当然,这个char c = 0x90;是无效的。同char g ="0x90"。
- \x90是一个整型常量,类型为int。
- 逃逸序列\x90为int型。也许你在想C语言以外的其他语言?
没有你在这里看到的是一个队列的可能性:P></
1 2
| char c = '\x90' // 1001 0000 in binary
int i = 0x90 // 1001 0000 in binary |
如果你do something like thisP></
1 2
| i = (int) c; // i is ffffff90
// casting is not necessary in C but this is just for this example |
因为SIGN(最左位int和char)carries to the left over to填充空间。P></
编辑:我知道int char是8bit位宽的宽为32。我知道当你传递int int char茶最右位拷贝过我字符c is 1001 0000(0x90)当你拷贝它到过int值1111 1111、1111 is by会展1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 1001(0xffffffffffffff90 because that is copied)1 to the left大胆thus让负面的价值。P></
intby the most char规则集与左前位是1负,在char c = 0x90thus C’是消极的P></
- 将c转换为int,当将char转换为int时,您不必这样做,但已经完成了。
- i = int (c)是C语言中的语法错误。符号位位置的约定是最左边的,而不是最右边的。
- 抱歉会搞错,我在用C++思考
- 所以,通过强制转换它就变成了ffffff 90,但是这个负数是什么呢?最左边的位不应该是1,二进制数就会变成负数。
- @如果这仍然没有帮助,那么没有任何帮助。
- @我编辑了我的答案,希望这有帮助。
- "按照规则,任何最左边的位设置为1的int或char都是负数。"您是指有符号的int/char,还是说这也适用于无符号的int/char?
- @Michi是的,我是说有符号的让我们不要现在就把他搞混了,因为他不知道负数在记忆中是如何表示的。
- 我不是在这里制造(试图制造)混乱,但是如果你理解我的观点,操作可以。
- @米奇,事实上,我是在试着不把他搞糊涂。:)不是你把他搞糊涂了。
- 我的观点是,"根据规则,任何最左边位设置为1的int或char都是负数。"应该改为"根据规则,任何最左边位设置为1的有符号int或有符号char都是负数。"…或许我错了。
- @Michi我在我的答案中修正了它。谢谢你指出这一点。
- 你是右边的GRC,它实际上在投射时将所有1复制到左边。这消除了我长达一周的困惑!