C 从命令行传递参数时*argv[]中字符的大小
我有一个简单的程序 包括 包括 如果sizeofchar总是1字节,我不明白ffffff从何而来 根据定义,sizeofchar为1,但'●' 不是C意义上的字符,生成3个字符 您的字符是可见签名的。在您的情况下,默认情况下,每个字符都是有签名的字符● 产生每3个负代码,因为在你的情况下你的字符被转换成一个int 32,格式%x考虑没有符号的参数,你有这些输出 执行printf%x,-30;->ffffffe2 int i=0时应注意的事项;iC 从命令行传递参数时*argv[]中字符的大小,c,unicode,utf-8,char,C,Unicode,Utf 8,Char,我有一个简单的程序 包括 包括 如果sizeofchar总是1字节,我不明白ffffff从何而来 根据定义,sizeofchar为1,但'●' 不是C意义上的字符,生成3个字符 您的字符是可见签名的。在您的情况下,默认情况下,每个字符都是有签名的字符● 产生每3个负代码,因为在你的情况下你的字符被转换成一个int 32,格式%x考虑没有符号的参数,你有这些输出 执行printf%x,-30;->ffffffe2 int i=0时应注意的事项;iffffffe2 int i=0时应注意的事项;i
printf("%x ", (unsigned char)argv[1][i]);
printf("%hhx ", argv[1][i]); // thanks to Jonathan Leffler
printf是一个接受可变数量参数的函数
小于int类型的任何整型参数都会自动转换为int类型
显然,在您的实现中,字符little round thing由3个字符组成,所有字符都带有负值
试试这些
printf("%x ", (unsigned char)argv[1][i]);
printf("%hhx ", argv[1][i]); // thanks to Jonathan Leffler
UTF-8代码单位用于多代码单位代码点,除ASCII之外的所有代码都在128到255之间,这意味着超出了ASCII范围 printf是一个vararg函数,传递给vararg部分的所有参数(格式字符串除外)都受标准升级的约束 由于您的实现的裸字符是8位带符号的2s补码,这意味着UTF-8 codeunit值是负数,介于-1和-128之间,升级后您将得到一个具有该值的int 然后你对printf撒谎,声称它是一个无符号的%x代表无符号整数,而2s补码会导致你的未定义行为打印一个非常大的无符号整数
使用%hhx可以得到正确的结果,但严格来说,应该将参数强制转换为无符号字符。UTF-8对于多代码单元代码点,除ASCII之外的所有代码单元都在128到255之间,这意味着超出了ASCII范围 printf是一个vararg函数,传递给vararg部分的所有参数(格式字符串除外)都受标准升级的约束 由于您的实现的裸字符是8位带符号的2s补码,这意味着UTF-8 codeunit值是负数,介于-1和-128之间,升级后您将得到一个具有该值的int 然后你对printf撒谎,声称它是一个无符号的%x代表无符号整数,而2s补码会导致你的未定义行为打印一个非常大的无符号整数
使用%hhx可以得到正确的结果,但严格来说,您应该将参数转换为unsigned char。相反,在他的实现中,char有一个符号,并且所有多代码单元代码点只包含大于127的代码单元,因此8bit 2s补码为负数。@重复数据消除器:您的意思是strlenlittle round thing==3表示1个多代码单元码点或3个字符?我改变了答案:是的,但这不是真正重要的部分。或者%hhx是转换规范。或者包括并打印%PRIx8,uint8_targv[1][I];使用精确的宽度类型。相反,在他的实现中,char有一个符号,所有多代码单元代码点只包含大于127的代码单元,因此在8bit 2s补码中为负数。@重复数据消除器:您的意思是strlenlittle round thing==3表示1个多代码单元代码点或3个字符?我改变了答案:是的,但这不是真正重要的部分。或者%hhx是转换规范。或者包括并打印%PRIx8,uint8_targv[1][I];使用精确宽度类型。Thansk表示有价值的建议。Thansk表示有价值的建议。